From c3d0def5e066d54e3e479886f506accc97d02f23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Sim=C3=B5es?= Date: Thu, 25 Sep 2025 02:09:29 +0100 Subject: [PATCH 1/2] Fix signature parser usage - Replaced wrong check of generics parameter count in parser when it should be in element. --- src/CLR/CorLib/corlib_native_System_Type.cpp | 6 ++-- src/CLR/Core/Execution.cpp | 6 ++-- src/CLR/Core/TypeSystem.cpp | 37 ++++++++++---------- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/CLR/CorLib/corlib_native_System_Type.cpp b/src/CLR/CorLib/corlib_native_System_Type.cpp index 14a6a5d1a7..796a8a26ae 100644 --- a/src/CLR/CorLib/corlib_native_System_Type.cpp +++ b/src/CLR/CorLib/corlib_native_System_Type.cpp @@ -145,7 +145,7 @@ HRESULT Library_corlib_native_System_Type::GetGenericArguments___SZARRAY_SystemT NANOCLR_CHECK_HRESULT(parser.Advance(elem)); // get the number of generic parameters - count = parser.GenParamCount; + count = elem.GenParamCount; // allocate an array to hold the generic arguments NANOCLR_CHECK_HRESULT(CLR_RT_HeapBlock_Array::CreateInstance(top, count, g_CLR_RT_WellKnownTypes.TypeStatic)); @@ -432,14 +432,14 @@ HRESULT Library_corlib_native_System_Type::get_IsGenericTypeDefinition___BOOLEAN parser.Advance(element); // check if it has generic parameters - if (parser.GenParamCount == 0) + if (element.GenParamCount == 0) { isTypeDefinition = false; } else { // keep reading the generic parameters - for (int i = 0; i < parser.GenParamCount; i++) + for (int i = 0; i < element.GenParamCount; i++) { if (SUCCEEDED(parser.Advance(element))) { diff --git a/src/CLR/Core/Execution.cpp b/src/CLR/Core/Execution.cpp index e31e66e3be..0007730916 100644 --- a/src/CLR/Core/Execution.cpp +++ b/src/CLR/Core/Execution.cpp @@ -2074,7 +2074,7 @@ HRESULT CLR_RT_ExecutionEngine::InitializeLocals( varParser.Advance(varElement); // consume parameters - for (int paramIndex = 0; paramIndex < varParser.GenParamCount; paramIndex++) + for (int paramIndex = 0; paramIndex < varElement.GenParamCount; paramIndex++) { NANOCLR_CHECK_HRESULT(varParser.Advance(varElement)); } @@ -2100,7 +2100,7 @@ HRESULT CLR_RT_ExecutionEngine::InitializeLocals( (const CLR_RT_TypeSpec_Index &)methodDefInstance.genericType->data); typeSpec.assembly->FindGenericParamAtTypeSpec( - methodDefInstance.genericType->TypeSpec(), + methodDefInstance.genericType->data, genericParamPosition, cls, dt); @@ -2108,7 +2108,7 @@ HRESULT CLR_RT_ExecutionEngine::InitializeLocals( else { assembly->FindGenericParamAtTypeSpec( - methodDefInstance.genericType->TypeSpec(), + methodDefInstance.genericType->data, genericParamPosition, cls, dt); diff --git a/src/CLR/Core/TypeSystem.cpp b/src/CLR/Core/TypeSystem.cpp index 8ea380e544..0aed1d06ca 100644 --- a/src/CLR/Core/TypeSystem.cpp +++ b/src/CLR/Core/TypeSystem.cpp @@ -801,7 +801,7 @@ bool CLR_RT_TypeSpec_Instance::ResolveToken( NanoCLRDataType realDataType; g_CLR_RT_TypeSystem.m_assemblies[caller->genericType->Assembly() - 1] - ->FindGenericParamAtTypeSpec(closedTsRow, (CLR_UINT32)pos, cachedElementType, realDataType); + ->FindGenericParamAtTypeSpec(caller->genericType->data, (CLR_UINT32)pos, cachedElementType, realDataType); } else if (element.DataType == DATATYPE_MVAR) { @@ -1156,16 +1156,17 @@ bool CLR_RT_TypeDef_Instance::ResolveToken( return false; } - auto &tsi = *caller->genericType; - CLR_UINT32 closedTsRow = tsi.TypeSpec(); - CLR_RT_TypeDef_Index realTypeDef; NanoCLRDataType realDataType; // Only call this once to map (e.g. !T→Int32) g_CLR_RT_TypeSystem.m_assemblies[caller->genericType->Assembly() - 1] - ->FindGenericParamAtTypeSpec(closedTsRow, (CLR_UINT32)pos, realTypeDef, realDataType); + ->FindGenericParamAtTypeSpec( + caller->genericType->data, + (CLR_UINT32)pos, + realTypeDef, + realDataType); // populate this instance data = realTypeDef.data; @@ -1278,14 +1279,12 @@ bool CLR_RT_TypeDef_Instance::ResolveNullableType( return false; } - auto &tsi = *caller->genericType; - CLR_UINT32 closedTsRow = tsi.TypeSpec(); - CLR_RT_TypeDef_Index realTypeDef; NanoCLRDataType realDataType; // Only call this once to map (e.g. !T→Int32) - caller->assembly->FindGenericParamAtTypeSpec(closedTsRow, (CLR_UINT32)pos, realTypeDef, realDataType); + caller->assembly + ->FindGenericParamAtTypeSpec(caller->genericType->data, (CLR_UINT32)pos, realTypeDef, realDataType); // populate this instance data = realTypeDef.data; @@ -1573,7 +1572,7 @@ bool CLR_RT_MethodDef_Instance::InitializeFromIndex( CLR_RT_TypeDef_Index realOwner; NanoCLRDataType dummyDT; - if (!tsAsm->FindGenericParamAtTypeSpec(typeSpec.TypeSpec(), elem.GenericParamPosition, realOwner, dummyDT)) + if (!tsAsm->FindGenericParamAtTypeSpec(typeSpec.data, elem.GenericParamPosition, realOwner, dummyDT)) { return false; } @@ -1877,7 +1876,7 @@ bool CLR_RT_MethodDef_Instance::GetDeclaringType(CLR_RT_TypeDef_Instance &declTy CLR_RT_TypeDef_Index td; NanoCLRDataType dt; if (tsAsm == nullptr || - tsAsm->FindGenericParamAtTypeSpec(genericType->TypeSpec(), (CLR_UINT32)pos, td, dt) == false) + tsAsm->FindGenericParamAtTypeSpec(genericType->data, (CLR_UINT32)pos, td, dt) == false) { return false; } @@ -2268,7 +2267,7 @@ HRESULT CLR_RT_TypeDescriptor::InitializeFromSignatureToken( // !T: ask the CLR to map that slot into the *actual* argument CLR_RT_TypeDef_Index td; NanoCLRDataType dt; - assm->FindGenericParamAtTypeSpec(caller->genericType->TypeSpec(), elem.GenericParamPosition, td, dt); + assm->FindGenericParamAtTypeSpec(caller->genericType->data, elem.GenericParamPosition, td, dt); this->InitializeFromTypeDef(td); } else if (elem.DataType == DATATYPE_MVAR) @@ -5090,7 +5089,7 @@ bool CLR_RT_Assembly::FindGenericParamAtTypeSpec( } // sanity check for invalid parameter position - if (genericParameterPosition > parser.GenParamCount) + if (genericParameterPosition > element.GenParamCount) { // not enough parameters!! return false; @@ -6623,14 +6622,14 @@ HRESULT CLR_RT_TypeSystem::BuildTypeName( BuildTypeName(typeDef, szBuffer, iBuffer); - if (parser.GenParamCount > 0) + if (element.GenParamCount > 0) { NANOCLR_CHECK_HRESULT(QueueStringToBuffer(szBuffer, iBuffer, "<")); closeGenericSignature = true; } - for (int i = 0; i < parser.GenParamCount; i++) + for (int i = 0; i < element.GenParamCount; i++) { // read the next element (should be either VAR, MVAR, or a concrete type) parser.Advance(element); @@ -6643,7 +6642,7 @@ HRESULT CLR_RT_TypeSystem::BuildTypeName( // this will bind !T→System.Int32, etc. typeSpecInstance.assembly->FindGenericParamAtTypeSpec( - typeIndex.TypeSpec(), // closed instantiation row + typeIndex.data, element.GenericParamPosition, // the !N slot realTd, realDt); @@ -6660,7 +6659,7 @@ HRESULT CLR_RT_TypeSystem::BuildTypeName( BuildTypeName(td, szBuffer, iBuffer); } - if (i + 1 < parser.GenParamCount) + if (i + 1 < element.GenParamCount) { NANOCLR_CHECK_HRESULT(QueueStringToBuffer(szBuffer, iBuffer, ",")); } @@ -6895,7 +6894,7 @@ HRESULT CLR_RT_TypeSystem::BuildMethodRefName(const CLR_RT_MethodRef_Index &meth CLR_SafeSprintf(szBuffer, iBuffer, c_CLR_RT_DataTypeLookup[element.DataType].m_name); #endif - if (i + 1 < parser.GenParamCount) + if (i + 1 < element.GenParamCount) { CLR_SafeSprintf(szBuffer, iBuffer, ","); } @@ -6979,7 +6978,7 @@ HRESULT CLR_RT_TypeSystem::BuildMethodSpecName(const CLR_RT_MethodSpec_Index &ms NANOCLR_CHECK_HRESULT(QueueStringToBuffer(szBuffer, iBuffer, c_CLR_RT_DataTypeLookup[element.DataType].m_name)); #endif - if (i + 1 < parser.GenParamCount) + if (i + 1 < element.GenParamCount) { NANOCLR_CHECK_HRESULT(QueueStringToBuffer(szBuffer, iBuffer, ",")); } From ea269fe690e6deb726e858ce8ee59e961b98b6d9 Mon Sep 17 00:00:00 2001 From: nfbot Date: Thu, 25 Sep 2025 01:13:18 +0000 Subject: [PATCH 2/2] Code style fixes Automated fixes for code style. --- src/CLR/Core/TypeSystem.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/CLR/Core/TypeSystem.cpp b/src/CLR/Core/TypeSystem.cpp index 0aed1d06ca..54daaae60a 100644 --- a/src/CLR/Core/TypeSystem.cpp +++ b/src/CLR/Core/TypeSystem.cpp @@ -800,8 +800,11 @@ bool CLR_RT_TypeSpec_Instance::ResolveToken( NanoCLRDataType realDataType; - g_CLR_RT_TypeSystem.m_assemblies[caller->genericType->Assembly() - 1] - ->FindGenericParamAtTypeSpec(caller->genericType->data, (CLR_UINT32)pos, cachedElementType, realDataType); + g_CLR_RT_TypeSystem.m_assemblies[caller->genericType->Assembly() - 1]->FindGenericParamAtTypeSpec( + caller->genericType->data, + (CLR_UINT32)pos, + cachedElementType, + realDataType); } else if (element.DataType == DATATYPE_MVAR) {