@@ -1301,79 +1301,47 @@ bool CLR_RT_FieldDef_Instance::ResolveToken(
13011301
13021302 case TBL_TypeSpec:
13031303 {
1304- const CLR_RECORD_FIELDREF *fr = assm->GetFieldRef (index);
1304+ // the metadata own (possibly open) TypeSpec...
1305+ const CLR_RT_TypeSpec_Index *mdTS = &assm->crossReferenceFieldRef [index].genericType ;
13051306
1306- switch (fr->Owner ())
1307+ // decide whether to prefer the caller’s closed-generic
1308+ const CLR_RT_TypeSpec_Index *effectiveTS = mdTS;
1309+ if (caller && caller->genericType && NANOCLR_INDEX_IS_VALID (*caller->genericType ))
13071310 {
1308- case TBL_TypeSpec:
1311+ CLR_RT_TypeSpec_Instance instCaller, instMd;
1312+ if (instCaller.InitializeFromIndex (*caller->genericType ) && instMd.InitializeFromIndex (*mdTS))
13091313 {
1310- // the metadata’s own (possibly open) TypeSpec…
1311- const CLR_RT_TypeSpec_Index *mdTS = &assm-> crossReferenceFieldRef [index]. genericType ;
1314+ CLR_RT_SignatureParser pC, pM;
1315+ CLR_RT_SignatureParser::Element eC, eM ;
13121316
1313- // decide whether to prefer the caller’s closed-generic
1314- const CLR_RT_TypeSpec_Index *effectiveTS = mdTS;
1315- if (caller && caller->genericType && NANOCLR_INDEX_IS_VALID (*caller->genericType ))
1316- {
1317- CLR_RT_TypeSpec_Instance instCaller, instMd;
1318- if (instCaller.InitializeFromIndex (*caller->genericType ) &&
1319- instMd.InitializeFromIndex (*mdTS))
1320- {
1321- CLR_RT_SignatureParser pC, pM;
1322- CLR_RT_SignatureParser::Element eC, eM;
1323-
1324- pC.Initialize_TypeSpec (instCaller.assembly , instCaller.target );
1325- pM.Initialize_TypeSpec (instMd.assembly , instMd.target );
1326-
1327- if (SUCCEEDED (pC.Advance (eC)) && SUCCEEDED (pM.Advance (eM)) &&
1328- eC.Class .data == eM.Class .data )
1329- {
1330- // same generic-definition token → use the caller’s closed TypeSpec
1331- effectiveTS = caller->genericType ;
1332- }
1333- }
1334- }
1317+ pC.Initialize_TypeSpec (instCaller.assembly , instCaller.target );
1318+ pM.Initialize_TypeSpec (instMd.assembly , instMd.target );
13351319
1336- // now bind against effectiveTS
1337- genericType = effectiveTS;
1338- // CLR_RT_Assembly *tsAsm = g_CLR_RT_TypeSystem.m_assemblies[effectiveTS->Assembly() - 1];
1339- // const CLR_RECORD_TYPESPEC *tsRec = tsAsm->GetTypeSpec(effectiveTS->TypeSpec());
1340-
1341- // // if (!tsAsm->FindFieldDef(tsRec, tsAsm->GetString(fr->name), tsAsm, fr->signature,
1342- // // resolved))
1343- // //{
1344- // // return false;
1345- // // }
1346- CLR_RT_FieldDef_Index resolved;
1347-
1348- if (!assm->FindFieldDef (
1349- genericType,
1350- assm->GetString (fr->name ),
1351- assm,
1352- fr->signature ,
1353- resolved))
1320+ if (SUCCEEDED (pC.Advance (eC)) && SUCCEEDED (pM.Advance (eM)) &&
1321+ eC.Class .data == eM.Class .data )
13541322 {
1355- return false ;
1323+ // same generic-definition token → use the caller’s closed TypeSpec
1324+ effectiveTS = caller->genericType ;
13561325 }
1357-
1358- data = resolved.data ;
1359- assembly = assm;
1360- target = assembly->GetFieldDef (Field ());
1361- return true ;
13621326 }
1327+ }
13631328
1364- case TBL_TypeRef:
1365- {
1366- // non-generic
1367- data = assm->crossReferenceFieldRef [index].target .data ;
1368- assembly = g_CLR_RT_TypeSystem.m_assemblies [Assembly () - 1 ];
1369- target = assembly->GetFieldDef (Field ());
1370- genericType = nullptr ;
1371- return true ;
1372- }
1329+ // now bind against effectiveTS
1330+ genericType = effectiveTS;
1331+
1332+ CLR_RT_FieldDef_Index resolved;
1333+
1334+ if (!assm->FindFieldDef (genericType, assm->GetString (fr->name ), assm, fr->signature , resolved))
1335+ {
1336+ return false ;
13731337 }
1374- return false ; // unknown owner
1375- }
13761338
1339+ data = resolved.data ;
1340+ assembly = assm;
1341+ target = assembly->GetFieldDef (Field ());
1342+
1343+ break ;
1344+ }
13771345 default :
13781346 // should not happen
13791347 return false ;
0 commit comments