Skip to content

Commit 046de42

Browse files
committed
Fix handling generic type in MethodDef instance
- Hardned check for generic type when using MethodDef. - Simplified getting and setting TypeSpec for generic type. - Now using pointers all the way instead of creating new TypeSpecs along the path. - Remove wrong this accessor.
1 parent a285c86 commit 046de42

File tree

4 files changed

+20
-9
lines changed

4 files changed

+20
-9
lines changed

src/CLR/Core/Execution.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2032,7 +2032,8 @@ HRESULT CLR_RT_ExecutionEngine::InitializeLocals(
20322032

20332033
CLR_RT_TypeSpec_Index genericTSIndex = {};
20342034

2035-
if (methodDefInstance.genericType && methodDefInstance.genericType->data != 0)
2035+
if (methodDefInstance.genericType && NANOCLR_INDEX_IS_VALID(*methodDefInstance.genericType) &&
2036+
methodDefInstance.genericType->data != CLR_EmptyToken)
20362037
{
20372038
// method is generic, it can only use class from method's class generic parameters
20382039
genericInstance.InitializeFromIndex(*methodDefInstance.genericType);
@@ -2093,7 +2094,8 @@ HRESULT CLR_RT_ExecutionEngine::InitializeLocals(
20932094
// type-level generic parameter in a locals signature (e.g. 'T' inside a generic type)
20942095
CLR_INT8 genericParamPosition = *sig++;
20952096

2096-
if (methodDefInstance.genericType && methodDefInstance.genericType->data != 0)
2097+
if (methodDefInstance.genericType && NANOCLR_INDEX_IS_VALID(*methodDefInstance.genericType) &&
2098+
methodDefInstance.genericType->data != CLR_EmptyToken)
20972099
{
20982100
CLR_RT_TypeSpec_Instance typeSpec{};
20992101
typeSpec.InitializeFromIndex(

src/CLR/Core/Interpreter.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2211,7 +2211,16 @@ HRESULT CLR_RT_Thread::Execute_IL(CLR_RT_StackFrame &stackArg)
22112211
NANOCLR_SET_AND_LEAVE(CLR_E_WRONG_TYPE);
22122212
}
22132213

2214-
calleeInst.InitializeFromIndex(calleeReal);
2214+
if (calleeInst.genericType && NANOCLR_INDEX_IS_VALID(*calleeInst.genericType) &&
2215+
calleeInst.genericType->data != CLR_EmptyToken)
2216+
{
2217+
// store the current generic context (if any)
2218+
calleeInst.InitializeFromIndex(calleeReal, *calleeInst.genericType);
2219+
}
2220+
else
2221+
{
2222+
calleeInst.InitializeFromIndex(calleeReal);
2223+
}
22152224
}
22162225

22172226
#if defined(NANOCLR_APPDOMAINS)

src/CLR/Core/TypeSystem.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1597,7 +1597,7 @@ bool CLR_RT_MethodDef_Instance::InitializeFromIndex(
15971597
}
15981598

15991599
// remember the TypeSpec so this is available when needed
1600-
this->genericType = &typeSpec;
1600+
genericType = &typeSpec;
16011601

16021602
return true;
16031603
}
@@ -1695,9 +1695,8 @@ bool CLR_RT_MethodDef_Instance::ResolveToken(
16951695
}
16961696
}
16971697

1698-
// Pick the “winner” between methodOwnerTS or callerGeneric:
1699-
const CLR_RT_TypeSpec_Index *definitiveTypeSpec = useCaller ? callerGeneric : methodOwnerTS;
1700-
genericType = (CLR_RT_TypeSpec_Index *)definitiveTypeSpec;
1698+
// Pick the "winner" between methodOwnerTS or callerGeneric:
1699+
genericType = useCaller ? callerGeneric : methodOwnerTS;
17011700

17021701
CLR_RT_Assembly *methodAssembly = g_CLR_RT_TypeSystem.m_assemblies[methodOwnerTS->Assembly() - 1];
17031702

@@ -6772,7 +6771,7 @@ HRESULT CLR_RT_TypeSystem::BuildMethodName(
67726771

67736772
declTypeIdx.Set(md.Assembly(), declTypeInst.assembly->crossReferenceMethodDef[md.Method()].GetOwner());
67746773

6775-
if (genericType != nullptr && genericType->data != 0xffffffff)
6774+
if (genericType != nullptr && NANOCLR_INDEX_IS_VALID(*genericType) && genericType->data != CLR_EmptyToken)
67766775
{
67776776
// parse TypeSpec to get its TypeDef
67786777
CLR_RT_TypeSpec_Instance tsInst = {};

src/CLR/Diagnostics/Info.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,8 @@ void CLR_RT_Assembly::DumpToken(CLR_UINT32 token, const CLR_RT_MethodDef_Instanc
481481
// use that, so ResizeArray prints as SimpleList<I4>::ResizeArray.
482482
// 2) Otherwise, fall back to xref.genericType (the raw MethodRef own owner).
483483
const CLR_RT_TypeSpec_Index *ownerTypeSpec;
484-
if (methodDefInstance.genericType != nullptr && NANOCLR_INDEX_IS_VALID(*methodDefInstance.genericType))
484+
if (methodDefInstance.genericType != nullptr && NANOCLR_INDEX_IS_VALID(*methodDefInstance.genericType) &&
485+
methodDefInstance.genericType->data != CLR_EmptyToken)
485486
{
486487
ownerTypeSpec = methodDefInstance.genericType;
487488
}

0 commit comments

Comments
 (0)