@@ -91,7 +91,7 @@ HRESULT CLR_RT_ExecutionEngine::ExecutionEngine_Initialize()
9191 // CLR_RT_Thread* m_cctorThread;
9292 //
9393#if !defined(NANOCLR_APPDOMAINS)
94- m_globalLock = nullptr ; // CLR_RT_HeapBlock* m_globalLock;
94+ m_globalLock = nullptr ; // CLR_RT_HeapBlock* m_globalLock;
9595 m_outOfMemoryException = nullptr ; // CLR_RT_HeapBlock* m_outOfMemoryException;
9696#endif
9797
@@ -2262,27 +2262,31 @@ HRESULT CLR_RT_ExecutionEngine::NewGenericInstanceObject(
22622262 const CLR_RECORD_FIELDDEF *target = nullptr ;
22632263 CLR_RT_Assembly *assm = nullptr ;
22642264 CLR_RT_TypeDef_Instance instSub = instance;
2265+ CLR_RT_HeapBlock_GenericInstance *giHeader = nullptr ;
2266+ CLR_RT_HeapBlock *fieldCursor = nullptr ;
22652267
22662268 reference.SetObjectReference (nullptr );
22672269
22682270 int clsFields = instance.target ->instanceFieldsCount ;
22692271 int totFields = instance.CrossReference ().totalFields + CLR_RT_HeapBlock::HB_Object_Fields_Offset;
22702272
2271- CLR_RT_HeapBlock_GenericInstance *genericInst;
2273+ giHeader = (CLR_RT_HeapBlock_GenericInstance *)ExtractHeapBlocksForGenericInstance (0 , genericInstance, totFields);
2274+ CHECK_ALLOCATION (giHeader);
22722275
2273- genericInst =
2274- (CLR_RT_HeapBlock_GenericInstance *)ExtractHeapBlocksForGenericInstance (0 , genericInstance, totFields);
2275- CHECK_ALLOCATION (genericInst);
2276+ reference.SetObjectReference (giHeader);
22762277
2277- reference.SetObjectReference (genericInst);
2278+ // Associate the instance with its declaring type for reflection & casting utilities.
2279+ giHeader->SetObjectCls (instance);
22782280
22792281 //
22802282 // Initialize field types, from last to first.
22812283 //
22822284 // We do the decrement BEFORE the comparison because we want to stop short of the first field, the
22832285 // object descriptor (already initialized).
22842286 //
2285- genericInst += totFields;
2287+
2288+ fieldCursor = reinterpret_cast <CLR_RT_HeapBlock *>(giHeader) + totFields;
2289+
22862290 while (--totFields > 0 )
22872291 {
22882292 while (clsFields == 0 )
@@ -2302,11 +2306,11 @@ HRESULT CLR_RT_ExecutionEngine::NewGenericInstanceObject(
23022306 target = assm->GetFieldDef (instSub.target ->firstInstanceField + clsFields);
23032307 }
23042308
2305- genericInst --;
2309+ fieldCursor --;
23062310 target--;
23072311 clsFields--;
23082312
2309- NANOCLR_CHECK_HRESULT (InitializeReference (*genericInst , target, assm));
2313+ NANOCLR_CHECK_HRESULT (InitializeReference (*fieldCursor , target, assm));
23102314 }
23112315
23122316 if (instance.HasFinalizer ())
0 commit comments