Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 37 additions & 18 deletions src/CLR/Core/TypeSystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1195,12 +1195,9 @@ bool CLR_RT_FieldDef_Instance::ResolveToken(CLR_UINT32 tk, CLR_RT_Assembly *assm
// Use the MDP TypeSpec (which is already the closed generic),
genericType = &assm->crossReferenceFieldRef[index].genericType;

// Retrieve that closed‐generic TypeSpec blob
const CLR_RECORD_TYPESPEC *ts = assm->GetTypeSpec(genericType->TypeSpec());

// Look up the actual FieldDef within that closed type
CLR_RT_FieldDef_Index resolvedField;
if (!assm->FindFieldDef(ts, assm->GetString(fr->name), assm, fr->signature, resolvedField))
if (!assm->FindFieldDef(genericType, assm->GetString(fr->name), assm, fr->signature, resolvedField))
{
return false;
}
Expand Down Expand Up @@ -3122,8 +3119,7 @@ HRESULT CLR_RT_Assembly::ResolveFieldRef()
#endif
}

if (!typeSpecInstance.assembly
->FindFieldDef(typeSpecInstance.target, fieldName, this, src->signature, dst->target))
if (!typeSpecInstance.assembly->FindFieldDef(&typeSpec, fieldName, this, src->signature, dst->target))
{
#if !defined(BUILD_RTM)
CLR_Debug::Printf("Unknown FieldRef: %s.%s.%s\r\n", "???", "???", fieldName);
Expand Down Expand Up @@ -3835,10 +3831,11 @@ HRESULT CLR_RT_AppDomain::GetManagedObject(CLR_RT_HeapBlock &res)

pRes = res.Dereference();

NANOCLR_CHECK_HRESULT(CLR_RT_ObjectToEvent_Source::CreateInstance(
this,
*pRes,
pRes[Library_corlib_native_System_AppDomain::FIELD___appDomain]));
NANOCLR_CHECK_HRESULT(
CLR_RT_ObjectToEvent_Source::CreateInstance(
this,
*pRes,
pRes[Library_corlib_native_System_AppDomain::FIELD___appDomain]));

pRes[Library_corlib_native_System_AppDomain::FIELD___friendlyName].SetObjectReference(m_strName);
}
Expand Down Expand Up @@ -4920,23 +4917,44 @@ bool CLR_RT_Assembly::FindFieldDef(
}

bool CLR_RT_Assembly::FindFieldDef(
const CLR_RECORD_TYPESPEC *ts,
const CLR_RT_TypeSpec_Index *tsIndex,
const char *fieldName,
CLR_RT_Assembly *base,
CLR_SIG sig,
CLR_RT_FieldDef_Index &index)
{
(void)ts;

NATIVE_PROFILE_CLR_CORE();

CLR_RT_SignatureParser parser;
parser.Initialize_TypeSpec(base, base->GetTypeSpec(tsIndex->TypeSpec()));

CLR_RT_SignatureParser::Element element;

// get type
parser.Advance(element);

// if this is a generic type, need to advance to get type
if (element.DataType == DATATYPE_GENERICINST)
{
parser.Advance(element);
}

CLR_RT_TypeDef_Index typeDef;
typeDef.data = element.Class.data;

CLR_RT_TypeDef_Instance typeDefInstance;
typeDefInstance.InitializeFromIndex(typeDef);

const char *typeName = GetString(typeDefInstance.target->name);

const CLR_RECORD_FIELDDEF *fd = GetFieldDef(0);

for (int i = 0; i < tablesSize[TBL_FieldDef]; i++, fd++)
{
const char *tempTypeName = GetString(fd->type);
const char *tempFieldName = GetString(fd->name);

if (!strcmp(fieldName, tempFieldName))
if (!strcmp(typeName, tempTypeName) && !strcmp(fieldName, tempFieldName))
{
if (base)
{
Expand Down Expand Up @@ -7037,10 +7055,11 @@ HRESULT CLR_RT_AttributeParser::Next(Value *&res)
}

// instantiate array to hold parameters values
NANOCLR_CHECK_HRESULT(CLR_RT_HeapBlock_Array::CreateInstance(
m_lastValue.m_value,
paramCount,
g_CLR_RT_WellKnownTypes.Object));
NANOCLR_CHECK_HRESULT(
CLR_RT_HeapBlock_Array::CreateInstance(
m_lastValue.m_value,
paramCount,
g_CLR_RT_WellKnownTypes.Object));

// get a pointer to the first element
auto *currentParam = (CLR_RT_HeapBlock *)m_lastValue.m_value.DereferenceArray()->GetFirstElement();
Expand Down
2 changes: 1 addition & 1 deletion src/CLR/Include/nanoCLR_Runtime.h
Original file line number Diff line number Diff line change
Expand Up @@ -1442,7 +1442,7 @@ struct CLR_RT_Assembly : public CLR_RT_HeapBlock_Node // EVENT HEAP - NO RELOCAT
CLR_SIG sig,
CLR_RT_FieldDef_Index &index);
bool FindFieldDef(
const CLR_RECORD_TYPESPEC *ts,
const CLR_RT_TypeSpec_Index *tsIndex,
const char *name,
CLR_RT_Assembly *base,
CLR_SIG sig,
Expand Down
12 changes: 10 additions & 2 deletions src/CLR/Include/nanoCLR_Types.h
Original file line number Diff line number Diff line change
Expand Up @@ -1061,10 +1061,10 @@ struct CLR_RECORD_ASSEMBLY
// when changing any of these structs need to update the constant in MDP
#define sizeOf_CLR_RECORD_ASSEMBLYREF 10
#define sizeOf_CLR_RECORD_TYPEREF 6
#define sizeOf_CLR_RECORD_FIELDREF 6
#define sizeOf_CLR_RECORD_FIELDREF 8
#define sizeOf_CLR_RECORD_METHODREF 6
#define sizeOf_CLR_RECORD_TYPEDEF 27
#define sizeOf_CLR_RECORD_FIELDDEF 8
#define sizeOf_CLR_RECORD_FIELDDEF 10
#define sizeOf_CLR_RECORD_METHODDEF 19
#define sizeOf_CLR_RECORD_TYPESPEC 2
#define sizeOf_CLR_RECORD_GENERICPARAM 10
Expand Down Expand Up @@ -1106,6 +1106,10 @@ CT_ASSERT(sizeof(CLR_RECORD_TYPEREF) == sizeOf_CLR_RECORD_TYPEREF)

struct CLR_RECORD_FIELDREF
{
/// @brief Index into TBL_Strings
///
CLR_STRING type;

/// @brief Index into TBL_Strings
///
CLR_STRING name;
Expand Down Expand Up @@ -1378,6 +1382,10 @@ struct CLR_RECORD_FIELDDEF

static const CLR_UINT16 FD_HasAttributes = 0x8000;

/// @brief Index into TBL_Strings
///
CLR_STRING type;

/// @brief Index into TBL_Strings
///
CLR_STRING name;
Expand Down
Loading