@@ -1195,12 +1195,9 @@ bool CLR_RT_FieldDef_Instance::ResolveToken(CLR_UINT32 tk, CLR_RT_Assembly *assm
1195
1195
// Use the MDP TypeSpec (which is already the closed generic),
1196
1196
genericType = &assm->crossReferenceFieldRef [index].genericType ;
1197
1197
1198
- // Retrieve that closed‐generic TypeSpec blob
1199
- const CLR_RECORD_TYPESPEC *ts = assm->GetTypeSpec (genericType->TypeSpec ());
1200
-
1201
1198
// Look up the actual FieldDef within that closed type
1202
1199
CLR_RT_FieldDef_Index resolvedField;
1203
- if (!assm->FindFieldDef (ts , assm->GetString (fr->name ), assm, fr->signature , resolvedField))
1200
+ if (!assm->FindFieldDef (genericType , assm->GetString (fr->name ), assm, fr->signature , resolvedField))
1204
1201
{
1205
1202
return false ;
1206
1203
}
@@ -3122,8 +3119,7 @@ HRESULT CLR_RT_Assembly::ResolveFieldRef()
3122
3119
#endif
3123
3120
}
3124
3121
3125
- if (!typeSpecInstance.assembly
3126
- ->FindFieldDef (typeSpecInstance.target , fieldName, this , src->signature , dst->target ))
3122
+ if (!typeSpecInstance.assembly ->FindFieldDef (&typeSpec, fieldName, this , src->signature , dst->target ))
3127
3123
{
3128
3124
#if !defined(BUILD_RTM)
3129
3125
CLR_Debug::Printf (" Unknown FieldRef: %s.%s.%s\r\n " , " ???" , " ???" , fieldName);
@@ -3835,10 +3831,11 @@ HRESULT CLR_RT_AppDomain::GetManagedObject(CLR_RT_HeapBlock &res)
3835
3831
3836
3832
pRes = res.Dereference ();
3837
3833
3838
- NANOCLR_CHECK_HRESULT (CLR_RT_ObjectToEvent_Source::CreateInstance (
3839
- this ,
3840
- *pRes,
3841
- pRes[Library_corlib_native_System_AppDomain::FIELD___appDomain]));
3834
+ NANOCLR_CHECK_HRESULT (
3835
+ CLR_RT_ObjectToEvent_Source::CreateInstance (
3836
+ this ,
3837
+ *pRes,
3838
+ pRes[Library_corlib_native_System_AppDomain::FIELD___appDomain]));
3842
3839
3843
3840
pRes[Library_corlib_native_System_AppDomain::FIELD___friendlyName].SetObjectReference (m_strName);
3844
3841
}
@@ -4920,23 +4917,44 @@ bool CLR_RT_Assembly::FindFieldDef(
4920
4917
}
4921
4918
4922
4919
bool CLR_RT_Assembly::FindFieldDef (
4923
- const CLR_RECORD_TYPESPEC *ts ,
4920
+ const CLR_RT_TypeSpec_Index *tsIndex ,
4924
4921
const char *fieldName,
4925
4922
CLR_RT_Assembly *base,
4926
4923
CLR_SIG sig,
4927
4924
CLR_RT_FieldDef_Index &index)
4928
4925
{
4929
- (void )ts;
4930
-
4931
4926
NATIVE_PROFILE_CLR_CORE ();
4932
4927
4928
+ CLR_RT_SignatureParser parser;
4929
+ parser.Initialize_TypeSpec (base, base->GetTypeSpec (tsIndex->TypeSpec ()));
4930
+
4931
+ CLR_RT_SignatureParser::Element element;
4932
+
4933
+ // get type
4934
+ parser.Advance (element);
4935
+
4936
+ // if this is a generic type, need to advance to get type
4937
+ if (element.DataType == DATATYPE_GENERICINST)
4938
+ {
4939
+ parser.Advance (element);
4940
+ }
4941
+
4942
+ CLR_RT_TypeDef_Index typeDef;
4943
+ typeDef.data = element.Class .data ;
4944
+
4945
+ CLR_RT_TypeDef_Instance typeDefInstance;
4946
+ typeDefInstance.InitializeFromIndex (typeDef);
4947
+
4948
+ const char *typeName = GetString (typeDefInstance.target ->name );
4949
+
4933
4950
const CLR_RECORD_FIELDDEF *fd = GetFieldDef (0 );
4934
4951
4935
4952
for (int i = 0 ; i < tablesSize[TBL_FieldDef]; i++, fd++)
4936
4953
{
4954
+ const char *tempTypeName = GetString (fd->type );
4937
4955
const char *tempFieldName = GetString (fd->name );
4938
4956
4939
- if (!strcmp (fieldName, tempFieldName))
4957
+ if (!strcmp (typeName, tempTypeName) && ! strcmp ( fieldName, tempFieldName))
4940
4958
{
4941
4959
if (base)
4942
4960
{
@@ -7037,10 +7055,11 @@ HRESULT CLR_RT_AttributeParser::Next(Value *&res)
7037
7055
}
7038
7056
7039
7057
// instantiate array to hold parameters values
7040
- NANOCLR_CHECK_HRESULT (CLR_RT_HeapBlock_Array::CreateInstance (
7041
- m_lastValue.m_value ,
7042
- paramCount,
7043
- g_CLR_RT_WellKnownTypes.Object ));
7058
+ NANOCLR_CHECK_HRESULT (
7059
+ CLR_RT_HeapBlock_Array::CreateInstance (
7060
+ m_lastValue.m_value ,
7061
+ paramCount,
7062
+ g_CLR_RT_WellKnownTypes.Object ));
7044
7063
7045
7064
// get a pointer to the first element
7046
7065
auto *currentParam = (CLR_RT_HeapBlock *)m_lastValue.m_value .DereferenceArray ()->GetFirstElement ();
0 commit comments