public static string FormatSignature(IAssemblyResolver assemblyResolver, ReadyToRunReader r2rReader, int imageOffset)
{
- SignatureDecoder decoder = new SignatureDecoder(assemblyResolver, r2rReader, imageOffset);
+ SignatureDecoder decoder = new SignatureDecoder(assemblyResolver, r2rReader.GetGlobalMetadataReader(), r2rReader, imageOffset);
string result = decoder.ReadR2RSignature();
return result;
}
private readonly MetadataReader _metadataReader;
/// <summary>
- /// ECMA reader representing the top-level signature context.
+ /// Outer ECMA reader is used as the default context for generic parameters.
+ /// </summary>
+ private readonly MetadataReader _outerReader;
+
+ /// <summary>
+ /// ECMA reader representing the reference module of the signature being decoded.
/// </summary>
private readonly ReadyToRunReader _contextReader;
/// <param name="options">Dump options and paths</param>
/// <param name="r2rReader">R2RReader object representing the PE file containing the ECMA metadata</param>
/// <param name="offset">Signature offset within the PE file byte array</param>
- public SignatureDecoder(IAssemblyResolver options, ReadyToRunReader r2rReader, int offset)
+ public SignatureDecoder(IAssemblyResolver options, MetadataReader metadataReader, ReadyToRunReader r2rReader, int offset)
{
- _metadataReader = r2rReader.GetGlobalMetadataReader();
+ _metadataReader = metadataReader;
+ _outerReader = metadataReader;
_options = options;
_image = r2rReader.Image;
_offset = offset;
/// <param name="metadataReader">Metadata reader for the R2R image</param>
/// <param name="signature">Signature to parse</param>
/// <param name="offset">Signature offset within the signature byte array</param>
+ /// <param name="outerReader">Metadata reader representing the outer signature context</param>
/// <param name="contextReader">Top-level signature context reader</param>
- private SignatureDecoder(IAssemblyResolver options, MetadataReader metadataReader, byte[] signature, int offset, ReadyToRunReader contextReader)
+ private SignatureDecoder(IAssemblyResolver options, MetadataReader metadataReader, byte[] signature, int offset, MetadataReader outerReader, ReadyToRunReader contextReader)
{
- _metadataReader = metadataReader;
- _options = options;
- _image = signature;
- _offset = offset;
- _contextReader = contextReader;
- }
-
- /// <summary>
- /// Construct the signature decoder by storing the image byte array and offset within the array.
- /// This variant uses the outer global metadata reader
- /// </summary>
- /// <param name="options">Dump options and paths</param>
- /// <param name="signature">Signature to parse</param>
- /// <param name="offset">Signature offset within the signature byte array</param>
- /// <param name="contextReader">Top-level signature context reader</param>
- private SignatureDecoder(IAssemblyResolver options, byte[] signature, int offset, ReadyToRunReader contextReader)
- {
- _metadataReader = contextReader.GetGlobalMetadataReader();
_options = options;
+ _metadataReader = metadataReader;
_image = signature;
_offset = offset;
+ _outerReader = outerReader;
_contextReader = contextReader;
}
fixupType &= ~(uint)ReadyToRunFixupKind.ModuleOverride;
int moduleIndex = (int)ReadUIntAndEmitInlineSignatureBinary(builder);
MetadataReader refAsmEcmaReader = _contextReader.OpenReferenceAssembly(moduleIndex);
- moduleDecoder = new SignatureDecoder(_options, refAsmEcmaReader, _image, _offset, _contextReader);
+ moduleDecoder = new SignatureDecoder(_options, refAsmEcmaReader, _image, _offset, refAsmEcmaReader, _contextReader);
}
moduleDecoder.ParseSignature((ReadyToRunFixupKind)fixupType, builder);
break;
case CorElementType.ELEMENT_TYPE_GENERICINST:
- SignatureDecoder outerTypeDecoder = new SignatureDecoder(_options, _image, _offset, _contextReader);
- outerTypeDecoder.ParseGenericTypeInstance(builder);
- _offset = outerTypeDecoder._offset;
+ ParseGenericTypeInstance(builder);
break;
case CorElementType.ELEMENT_TYPE_TYPEDBYREF:
{
int moduleIndex = (int)ReadUIntAndEmitInlineSignatureBinary(builder);
MetadataReader refAsmReader = _contextReader.OpenReferenceAssembly(moduleIndex);
- SignatureDecoder refAsmDecoder = new SignatureDecoder(_options, refAsmReader, _image, _offset, _contextReader);
+ SignatureDecoder refAsmDecoder = new SignatureDecoder(_options, refAsmReader, _image, _offset, _outerReader, _contextReader);
refAsmDecoder.ParseType(builder);
_offset = refAsmDecoder.Offset;
}
{
ParseType(builder);
uint typeArgCount = ReadUIntAndEmitInlineSignatureBinary(builder);
+ SignatureDecoder outerDecoder = new SignatureDecoder(_options, _outerReader, _image, _offset, _outerReader, _contextReader);
builder.Append("<");
for (uint paramIndex = 0; paramIndex < typeArgCount; paramIndex++)
{
{
builder.Append(", ");
}
- ParseType(builder);
+ outerDecoder.ParseType(builder);
}
builder.Append(">");
+ _offset = outerDecoder.Offset;
}
private void ParseTypeToken(StringBuilder builder)
string owningTypeOverride = null;
if ((methodFlags & (uint)ReadyToRunMethodSigFlags.READYTORUN_METHOD_SIG_OwnerType) != 0)
{
- SignatureDecoder owningTypeDecoder = new SignatureDecoder(_options, _metadataReader, _image, _offset, _contextReader);
- owningTypeOverride = owningTypeDecoder.ReadTypeSignatureNoEmit();
- _offset = owningTypeDecoder._offset;
+ owningTypeOverride = ReadTypeSignatureNoEmit();
}
if ((methodFlags & (uint)ReadyToRunMethodSigFlags.READYTORUN_METHOD_SIG_SlotInsteadOfToken) != 0)
{