Skip to content

Commit 4803a77

Browse files
committed
Fix locals initialization
- When parsing a generic type, it wasn't consuming the complete signature.
1 parent aff8379 commit 4803a77

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

src/CLR/Core/Execution.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2037,21 +2037,33 @@ HRESULT CLR_RT_ExecutionEngine::InitializeLocals(
20372037
// copy over to parameter
20382038
genericInstance.InitializeFromIndex(genericTSIndex);
20392039

2040-
CLR_RT_SignatureParser sp;
2041-
sp.Initialize_TypeSpec(assembly, assembly->GetTypeSpec(genericInstance.TypeSpec()));
2040+
CLR_RT_SignatureParser parser;
2041+
parser.Initialize_TypeSpec(assembly, assembly->GetTypeSpec(genericInstance.TypeSpec()));
20422042

20432043
CLR_RT_SignatureParser::Element element;
2044-
NANOCLR_CHECK_HRESULT(sp.Advance(element));
2044+
NANOCLR_CHECK_HRESULT(parser.Advance(element));
20452045

20462046
// if this is another generic instance, need to advance to get the type
20472047
if (dt == DATATYPE_GENERICINST)
20482048
{
2049-
NANOCLR_CHECK_HRESULT(sp.Advance(element));
2049+
NANOCLR_CHECK_HRESULT(parser.Advance(element));
20502050
}
20512051

20522052
cls = element.Class;
20532053
dt = element.DataType;
20542054

2055+
// consume the generic parameters from the signature
2056+
for (int paramIndex = 0; paramIndex < parser.GenParamCount; paramIndex++)
2057+
{
2058+
NANOCLR_CHECK_HRESULT(parser.Advance(element));
2059+
}
2060+
2061+
// need to advance the signature to consume it
2062+
while (parser.Signature != sig)
2063+
{
2064+
sig++;
2065+
}
2066+
20552067
goto done;
20562068
}
20572069

0 commit comments

Comments
 (0)