Skip to content

Commit e0c3b31

Browse files
committed
Fix FieldDef_Instance::ResolveToken
- Was duplicating the parsing of the FieldRef. - Now it's pointing to the correct FieldDef.
1 parent 534a980 commit e0c3b31

File tree

1 file changed

+30
-62
lines changed

1 file changed

+30
-62
lines changed

src/CLR/Core/TypeSystem.cpp

Lines changed: 30 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)