Skip to content

Commit 8fbcb09

Browse files
authored
Fix handling of TypeSpec token for arrays (#3193)
***NO_CI***
1 parent d93b7b8 commit 8fbcb09

File tree

3 files changed

+31
-14
lines changed

3 files changed

+31
-14
lines changed

src/CLR/Core/TypeSystem.cpp

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6244,12 +6244,17 @@ HRESULT CLR_RT_TypeSystem::QueueStringToBuffer(char *&szBuffer, size_t &iBuffer,
62446244
NANOCLR_NOCLEANUP();
62456245
}
62466246

6247-
HRESULT CLR_RT_TypeSystem::BuildTypeName(const CLR_RT_TypeSpec_Index &typeIndex, char *&szBuffer, size_t &iBuffer)
6247+
HRESULT CLR_RT_TypeSystem::BuildTypeName(
6248+
const CLR_RT_TypeSpec_Index &typeIndex,
6249+
char *&szBuffer,
6250+
size_t &iBuffer,
6251+
CLR_UINT32 levels)
62486252
{
62496253
NATIVE_PROFILE_CLR_CORE();
62506254
NANOCLR_HEADER();
62516255

62526256
CLR_RT_TypeSpec_Instance instance;
6257+
bool closeGenericSignature = false;
62536258

62546259
if (instance.InitializeFromIndex(typeIndex) == false)
62556260
{
@@ -6269,7 +6274,12 @@ HRESULT CLR_RT_TypeSystem::BuildTypeName(const CLR_RT_TypeSpec_Index &typeIndex,
62696274

62706275
BuildTypeName(typeDef, szBuffer, iBuffer);
62716276

6272-
NANOCLR_CHECK_HRESULT(QueueStringToBuffer(szBuffer, iBuffer, "<"));
6277+
if (parser.GenParamCount > 0)
6278+
{
6279+
NANOCLR_CHECK_HRESULT(QueueStringToBuffer(szBuffer, iBuffer, "<"));
6280+
6281+
closeGenericSignature = true;
6282+
}
62736283

62746284
for (int i = 0; i < parser.GenParamCount; i++)
62756285
{
@@ -6307,7 +6317,15 @@ HRESULT CLR_RT_TypeSystem::BuildTypeName(const CLR_RT_TypeSpec_Index &typeIndex,
63076317
}
63086318
}
63096319

6310-
NANOCLR_CHECK_HRESULT(QueueStringToBuffer(szBuffer, iBuffer, ">"));
6320+
if (closeGenericSignature)
6321+
{
6322+
NANOCLR_CHECK_HRESULT(QueueStringToBuffer(szBuffer, iBuffer, ">"));
6323+
}
6324+
6325+
while (levels-- > 0)
6326+
{
6327+
NANOCLR_CHECK_HRESULT(QueueStringToBuffer(szBuffer, iBuffer, "[]"));
6328+
}
63116329

63126330
NANOCLR_NOCLEANUP();
63136331
}

src/CLR/Diagnostics/Info.cpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ void CLR_RT_Assembly::DumpToken(CLR_UINT32 token, const CLR_RT_TypeSpec_Index *g
452452
// Build the closed‐generic owner name
453453
char rgType[256], *sz = rgType;
454454
size_t cb = sizeof(rgType);
455-
g_CLR_RT_TypeSystem.BuildTypeName(*genericType, sz, cb);
455+
g_CLR_RT_TypeSystem.BuildTypeName(*genericType, sz, cb, 0);
456456

457457
// Append the field name
458458
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
554554
char bufCorrupt[256];
555555
char *pCorrupt = bufCorrupt;
556556
size_t cbCorrupt = sizeof(bufCorrupt);
557-
g_CLR_RT_TypeSystem.BuildTypeName(tsIdx, pCorrupt, cbCorrupt);
557+
g_CLR_RT_TypeSystem.BuildTypeName(tsIdx, pCorrupt, cbCorrupt, elem.Levels);
558558
CLR_Debug::Printf("%s", bufCorrupt);
559559
break;
560560
}
@@ -596,8 +596,7 @@ void CLR_RT_Assembly::DumpToken(CLR_UINT32 token, const CLR_RT_TypeSpec_Index *g
596596
}
597597
break;
598598
}
599-
600-
if (elem.DataType == DATATYPE_SZARRAY)
599+
else if (elem.DataType == DATATYPE_SZARRAY)
601600
{
602601
// advance to see what’s inside the array
603602
if (FAILED(parser.Advance(elem)))
@@ -648,18 +647,18 @@ void CLR_RT_Assembly::DumpToken(CLR_UINT32 token, const CLR_RT_TypeSpec_Index *g
648647
char bufArr[256];
649648
char *pArr = bufArr;
650649
size_t cbArr = sizeof(bufArr);
651-
g_CLR_RT_TypeSystem.BuildTypeName(tsIdx, pArr, cbArr);
650+
g_CLR_RT_TypeSystem.BuildTypeName(tsIdx, pArr, cbArr, elem.Levels);
652651
CLR_Debug::Printf("%s", bufArr);
653652
break;
654653
}
655654
}
656655

657656
// now all the rest: just print the full type name
658-
char bufGeneric[256];
659-
char *pGeneric = bufGeneric;
660-
size_t cbGeneric = sizeof(bufGeneric);
661-
g_CLR_RT_TypeSystem.BuildTypeName(tsIdx, pGeneric, cbGeneric);
662-
CLR_Debug::Printf("%s", bufGeneric);
657+
char bufTypeName[256];
658+
char *pTypeName = bufTypeName;
659+
size_t cbType = sizeof(bufTypeName);
660+
g_CLR_RT_TypeSystem.BuildTypeName(tsIdx, pTypeName, cbType, elem.Levels);
661+
CLR_Debug::Printf("%s", bufTypeName);
663662
break;
664663
}
665664

src/CLR/Include/nanoCLR_Runtime.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2000,7 +2000,7 @@ struct CLR_RT_TypeSystem // EVENT HEAP - NO RELOCATION -
20002000
const CLR_RECORD_RESOURCE *&res,
20012001
CLR_UINT32 &size);
20022002

2003-
HRESULT BuildTypeName(const CLR_RT_TypeSpec_Index &typeIndex, char *&szBuffer, size_t &iBuffer);
2003+
HRESULT BuildTypeName(const CLR_RT_TypeSpec_Index &typeIndex, char *&szBuffer, size_t &iBuffer, CLR_UINT32 levels);
20042004
HRESULT BuildTypeName(
20052005
const CLR_RT_TypeDef_Index &cls,
20062006
char *&szBuffer,

0 commit comments

Comments
 (0)