@@ -30,15 +30,19 @@ class GCHandleUtilities
30
30
GCHandleUtilities () = delete ;
31
31
};
32
32
33
- void ValidateHandleAndAppDomain (OBJECTHANDLE handle);
33
+ void ValidateObjectAndAppDomain (OBJECTREF objRef, ADIndex appDomainIndex);
34
+ void ValidateHandleAssignment (OBJECTHANDLE handle, OBJECTREF objRef);
34
35
35
36
// Given a handle, returns an OBJECTREF for the object it refers to.
36
37
inline OBJECTREF ObjectFromHandle (OBJECTHANDLE handle)
37
38
{
38
39
_ASSERTE (handle);
39
40
40
41
#ifdef _DEBUG_IMPL
41
- ValidateHandleAndAppDomain (handle);
42
+ DWORD context = (DWORD)GCHandleUtilities::GetGCHandleManager ()->GetHandleContext (handle);
43
+ OBJECTREF objRef = ObjectToOBJECTREF (*(Object**)handle);
44
+
45
+ ValidateObjectAndAppDomain (objRef, ADIndex (context));
42
46
#endif // _DEBUG_IMPL
43
47
44
48
// Wrap the raw OBJECTREF and return it
@@ -173,16 +177,22 @@ inline OBJECTHANDLE CreateVariableHandle(IGCHandleStore* store, OBJECTREF object
173
177
174
178
inline void StoreObjectInHandle (OBJECTHANDLE handle, OBJECTREF object)
175
179
{
180
+ ValidateHandleAssignment (handle, object);
181
+
176
182
GCHandleUtilities::GetGCHandleManager ()->StoreObjectInHandle (handle, OBJECTREFToObject (object));
177
183
}
178
184
179
185
inline bool StoreFirstObjectInHandle (OBJECTHANDLE handle, OBJECTREF object)
180
186
{
187
+ ValidateHandleAssignment (handle, object);
188
+
181
189
return GCHandleUtilities::GetGCHandleManager ()->StoreObjectInHandleIfNull (handle, OBJECTREFToObject (object));
182
190
}
183
191
184
192
inline void * InterlockedCompareExchangeObjectInHandle (OBJECTHANDLE handle, OBJECTREF object, OBJECTREF comparandObject)
185
193
{
194
+ ValidateHandleAssignment (handle, object);
195
+
186
196
return GCHandleUtilities::GetGCHandleManager ()->CompareAndSwapObjectInHandle (handle, OBJECTREFToObject (object), OBJECTREFToObject (comparandObject));
187
197
}
188
198
0 commit comments