@@ -232,17 +232,54 @@ HRESULT CLR_RT_HeapBlock::SetReflection(const CLR_RT_Assembly_Index &assm)
232232 NANOCLR_NOCLEANUP_NOLABEL ();
233233}
234234
235- HRESULT CLR_RT_HeapBlock::SetReflection (const CLR_RT_TypeSpec_Index &sig )
235+ HRESULT CLR_RT_HeapBlock::SetReflection (const CLR_RT_TypeSpec_Instance &tsInst, const CLR_RT_TypeSpec_Index *caller )
236236{
237237 NATIVE_PROFILE_CLR_CORE ();
238238 NANOCLR_HEADER ();
239239
240- CLR_RT_TypeDescriptor desc{};
240+ m_id.raw = CLR_RT_HEAPBLOCK_RAW_ID (DATATYPE_REFLECTION, 0 , 1 );
241+ m_data.reflection .kind = REFLECTION_TYPE;
241242
242- NANOCLR_CHECK_HRESULT (desc.InitializeFromTypeSpec (sig));
243+ // start parsing the signature
244+ CLR_RT_SignatureParser parser;
245+ parser.Initialize_TypeSpec (tsInst.assembly , tsInst.target );
243246
244- m_id.raw = CLR_RT_HEAPBLOCK_RAW_ID (DATATYPE_REFLECTION, 0 , 1 );
245- m_data.reflection = desc.m_reflex ;
247+ // read first element
248+ CLR_RT_SignatureParser::Element elem;
249+ if (FAILED (parser.Advance (elem)))
250+ {
251+ NANOCLR_SET_AND_LEAVE (CLR_E_WRONG_TYPE);
252+ }
253+
254+ if (elem.DataType == DATATYPE_VAR || elem.DataType == DATATYPE_MVAR)
255+ {
256+ int gpIndex = elem.GenericParamPosition ;
257+
258+ // if the caller's genericType is non‐null, ask the CLR to map !n→actual argument:
259+ if (caller != nullptr && NANOCLR_INDEX_IS_VALID (*caller))
260+ {
261+ CLR_RT_TypeDef_Index tdArg{};
262+ NanoCLRDataType dtArg;
263+
264+ bool ok = g_CLR_RT_TypeSystem.m_assemblies [caller->Assembly () - 1 ]
265+ ->FindGenericParamAtTypeSpec (caller->TypeSpec (), gpIndex, tdArg, dtArg);
266+ if (ok)
267+ {
268+ m_data.reflection .data .type = tdArg;
269+ m_data.reflection .levels = elem.Levels ;
270+ }
271+ }
272+ else
273+ {
274+ // TODO
275+ _ASSERTE (false );
276+ }
277+ }
278+ else
279+ {
280+ m_data.reflection .data .type = elem.Class ;
281+ m_data.reflection .levels = elem.Levels ;
282+ }
246283
247284 NANOCLR_NOCLEANUP ();
248285}
0 commit comments