@@ -440,8 +440,6 @@ HRESULT CLR_RT_SignatureParser::Advance(Element &res)
440440
441441 NANOCLR_HEADER ();
442442
443- _ASSERTE (ParamCount > 0 );
444-
445443 ParamCount--;
446444
447445 res.IsByRef = false ;
@@ -988,13 +986,36 @@ bool CLR_RT_TypeDef_Instance::ResolveToken(
988986 case DATATYPE_VAR :
989987 {
990988 CLR_RT_TypeDef_Index typeDef;
991- NanoCLRDataType dataType;
989+ CLR_RT_SignatureParser::Element genericElement;
990+
991+ CLR_RT_SignatureParser varParser;
992+ varParser.Initialize_TypeSpec (assm, ts);
992993
993- caller->assembly ->FindGenericParamAtTypeSpec (*caller, genericParamPosition, typeDef, dataType);
994+ // advance once to consume the GENERICINST or VAR entry
995+ varParser.Advance (genericElement);
994996
997+ // now walk forward genericParameterPosition steps to land on the actual
998+ // argument in the signature stream.
999+ for (CLR_INT8 i = 0 ; i <= genericParamPosition; i++)
1000+ {
1001+ if (FAILED (varParser.Advance (genericElement)))
1002+ {
1003+ return false ;
1004+ }
1005+ }
1006+
1007+ // genericElement.Class now holds the TypeDef_Index of the T or U, etc.
1008+ typeDef = genericElement.Class ;
1009+
1010+ // populate this instance from the resolved TypeDef
9951011 data = typeDef.data ;
9961012 assembly = g_CLR_RT_TypeSystem.m_assemblies [typeDef.Assembly () - 1 ];
9971013 target = assembly->GetTypeDef (typeDef.Type ());
1014+
1015+ #if defined(NANOCLR_INSTANCE_NAMES)
1016+ name = assembly->GetString (target->name );
1017+ #endif
1018+ return true ;
9981019 }
9991020 break ;
10001021
@@ -4455,36 +4476,6 @@ bool CLR_RT_Assembly::FindGenericParam(CLR_INDEX typeSpecIndex, CLR_RT_GenericPa
44554476 return false ;
44564477}
44574478
4458- bool CLR_RT_Assembly::FindGenericParamAtTypeSpec (
4459- CLR_RT_MethodDef_Instance md,
4460- CLR_UINT32 genericParameterPosition,
4461- CLR_RT_TypeDef_Index &index,
4462- NanoCLRDataType &dataType)
4463- {
4464- NATIVE_PROFILE_CLR_CORE ();
4465-
4466- CLR_RT_SignatureParser parser;
4467- parser.Initialize_TypeSpec (md.assembly , md.assembly ->GetTypeSpec (md.genericType ->TypeSpec ()));
4468-
4469- CLR_RT_SignatureParser::Element element;
4470-
4471- // get type
4472- parser.Advance (element);
4473-
4474- for (uint32_t i = 0 ; i <= genericParameterPosition; i++)
4475- {
4476- if (FAILED (parser.Advance (element)))
4477- {
4478- return false ;
4479- }
4480- }
4481-
4482- index = element.Class ;
4483- dataType = element.DataType ;
4484-
4485- return true ;
4486- }
4487-
44884479bool CLR_RT_Assembly::FindGenericParamAtMethodDef (
44894480 CLR_RT_MethodDef_Instance md,
44904481 CLR_UINT32 genericParameterPosition,
0 commit comments