diff --git a/src/CLR/Core/TypeSystem.cpp b/src/CLR/Core/TypeSystem.cpp index 2dde482801..d9fc7ea430 100644 --- a/src/CLR/Core/TypeSystem.cpp +++ b/src/CLR/Core/TypeSystem.cpp @@ -6244,12 +6244,17 @@ HRESULT CLR_RT_TypeSystem::QueueStringToBuffer(char *&szBuffer, size_t &iBuffer, NANOCLR_NOCLEANUP(); } -HRESULT CLR_RT_TypeSystem::BuildTypeName(const CLR_RT_TypeSpec_Index &typeIndex, char *&szBuffer, size_t &iBuffer) +HRESULT CLR_RT_TypeSystem::BuildTypeName( + const CLR_RT_TypeSpec_Index &typeIndex, + char *&szBuffer, + size_t &iBuffer, + CLR_UINT32 levels) { NATIVE_PROFILE_CLR_CORE(); NANOCLR_HEADER(); CLR_RT_TypeSpec_Instance instance; + bool closeGenericSignature = false; if (instance.InitializeFromIndex(typeIndex) == false) { @@ -6269,7 +6274,12 @@ HRESULT CLR_RT_TypeSystem::BuildTypeName(const CLR_RT_TypeSpec_Index &typeIndex, BuildTypeName(typeDef, szBuffer, iBuffer); - NANOCLR_CHECK_HRESULT(QueueStringToBuffer(szBuffer, iBuffer, "<")); + if (parser.GenParamCount > 0) + { + NANOCLR_CHECK_HRESULT(QueueStringToBuffer(szBuffer, iBuffer, "<")); + + closeGenericSignature = true; + } for (int i = 0; i < parser.GenParamCount; i++) { @@ -6307,7 +6317,15 @@ HRESULT CLR_RT_TypeSystem::BuildTypeName(const CLR_RT_TypeSpec_Index &typeIndex, } } - NANOCLR_CHECK_HRESULT(QueueStringToBuffer(szBuffer, iBuffer, ">")); + if (closeGenericSignature) + { + NANOCLR_CHECK_HRESULT(QueueStringToBuffer(szBuffer, iBuffer, ">")); + } + + while (levels-- > 0) + { + NANOCLR_CHECK_HRESULT(QueueStringToBuffer(szBuffer, iBuffer, "[]")); + } NANOCLR_NOCLEANUP(); } diff --git a/src/CLR/Diagnostics/Info.cpp b/src/CLR/Diagnostics/Info.cpp index 2a626dc5b0..dc14bb5820 100644 --- a/src/CLR/Diagnostics/Info.cpp +++ b/src/CLR/Diagnostics/Info.cpp @@ -452,7 +452,7 @@ void CLR_RT_Assembly::DumpToken(CLR_UINT32 token, const CLR_RT_TypeSpec_Index *g // Build the closed‐generic owner name char rgType[256], *sz = rgType; size_t cb = sizeof(rgType); - g_CLR_RT_TypeSystem.BuildTypeName(*genericType, sz, cb); + g_CLR_RT_TypeSystem.BuildTypeName(*genericType, sz, cb, 0); // Append the field name CLR_SafeSprintf(sz, cb, "::%s", GetString(fr->name)); @@ -554,7 +554,7 @@ void CLR_RT_Assembly::DumpToken(CLR_UINT32 token, const CLR_RT_TypeSpec_Index *g char bufCorrupt[256]; char *pCorrupt = bufCorrupt; size_t cbCorrupt = sizeof(bufCorrupt); - g_CLR_RT_TypeSystem.BuildTypeName(tsIdx, pCorrupt, cbCorrupt); + g_CLR_RT_TypeSystem.BuildTypeName(tsIdx, pCorrupt, cbCorrupt, elem.Levels); CLR_Debug::Printf("%s", bufCorrupt); break; } @@ -596,8 +596,7 @@ void CLR_RT_Assembly::DumpToken(CLR_UINT32 token, const CLR_RT_TypeSpec_Index *g } break; } - - if (elem.DataType == DATATYPE_SZARRAY) + else if (elem.DataType == DATATYPE_SZARRAY) { // advance to see what’s inside the array if (FAILED(parser.Advance(elem))) @@ -648,18 +647,18 @@ void CLR_RT_Assembly::DumpToken(CLR_UINT32 token, const CLR_RT_TypeSpec_Index *g char bufArr[256]; char *pArr = bufArr; size_t cbArr = sizeof(bufArr); - g_CLR_RT_TypeSystem.BuildTypeName(tsIdx, pArr, cbArr); + g_CLR_RT_TypeSystem.BuildTypeName(tsIdx, pArr, cbArr, elem.Levels); CLR_Debug::Printf("%s", bufArr); break; } } // now all the rest: just print the full type name - char bufGeneric[256]; - char *pGeneric = bufGeneric; - size_t cbGeneric = sizeof(bufGeneric); - g_CLR_RT_TypeSystem.BuildTypeName(tsIdx, pGeneric, cbGeneric); - CLR_Debug::Printf("%s", bufGeneric); + char bufTypeName[256]; + char *pTypeName = bufTypeName; + size_t cbType = sizeof(bufTypeName); + g_CLR_RT_TypeSystem.BuildTypeName(tsIdx, pTypeName, cbType, elem.Levels); + CLR_Debug::Printf("%s", bufTypeName); break; } diff --git a/src/CLR/Include/nanoCLR_Runtime.h b/src/CLR/Include/nanoCLR_Runtime.h index 8607577141..f59689d17c 100644 --- a/src/CLR/Include/nanoCLR_Runtime.h +++ b/src/CLR/Include/nanoCLR_Runtime.h @@ -2000,7 +2000,7 @@ struct CLR_RT_TypeSystem // EVENT HEAP - NO RELOCATION - const CLR_RECORD_RESOURCE *&res, CLR_UINT32 &size); - HRESULT BuildTypeName(const CLR_RT_TypeSpec_Index &typeIndex, char *&szBuffer, size_t &iBuffer); + HRESULT BuildTypeName(const CLR_RT_TypeSpec_Index &typeIndex, char *&szBuffer, size_t &iBuffer, CLR_UINT32 levels); HRESULT BuildTypeName( const CLR_RT_TypeDef_Index &cls, char *&szBuffer,