@@ -413,7 +413,7 @@ const CLR_UINT8 *CLR_SkipBodyOfOpcodeCompressed(const CLR_UINT8 *ip, CLR_OPCODE
413413
414414#if defined(NANOCLR_TRACE_INSTRUCTIONS)
415415
416- void CLR_RT_Assembly::DumpToken (CLR_UINT32 token)
416+ void CLR_RT_Assembly::DumpToken (CLR_UINT32 token, const CLR_RT_TypeSpec_Index *genericType )
417417{
418418 NATIVE_PROFILE_CLR_DIAGNOSTICS ();
419419 CLR_UINT32 index = CLR_DataFromTk (token);
@@ -443,14 +443,27 @@ void CLR_RT_Assembly::DumpToken(CLR_UINT32 token)
443443 }
444444 case TBL_FieldRef:
445445 {
446- LOOKUP_ELEMENT_REF (index, FieldRef, FIELDREF, FieldDef);
447- if (s)
446+ const CLR_RECORD_FIELDREF *fr = GetFieldRef (index);
447+ const auto &xref = crossReferenceFieldRef[index];
448+
449+ // If the caller passed in a closed‐generic TypeSpec, use that …
450+ if (genericType->data != CLR_EmptyToken)
448451 {
449- CLR_RT_DUMP::FIELD (*s);
452+ // Build the closed‐generic owner name
453+ char rgType[256 ], *sz = rgType;
454+ size_t cb = sizeof (rgType);
455+ g_CLR_RT_TypeSystem.BuildTypeName (*genericType, sz, cb);
456+
457+ // Append the field name
458+ CLR_SafeSprintf (sz, cb, " ::%s" , GetString (fr->name ));
459+ CLR_Debug::Printf (" %s" , rgType);
450460 }
451461 else
452462 {
453- CLR_Debug::Printf (" %s" , GetString (p->name ));
463+ // Otherwise fall back to the old FieldDef path
464+ CLR_RT_FieldDef_Index fd;
465+ fd.Set (assemblyIndex, xref.target .data );
466+ CLR_RT_DUMP::FIELD (fd);
454467 }
455468 break ;
456469 }
@@ -662,7 +675,7 @@ void CLR_RT_Assembly::DumpOpcodeDirect(
662675
663676 if (IsOpParamToken (opParam))
664677 {
665- DumpToken (CLR_ReadTokenCompressed (ip, op));
678+ DumpToken (CLR_ReadTokenCompressed (ip, op), call. genericType );
666679 }
667680 else
668681 {
0 commit comments