Browse Source

Fix #3056: WriteParameterReference was using the wrong parameter definition in static methods.

release/8.1
Siegfried Pammer 2 years ago
parent
commit
0cdac3fe1e
  1. 44
      ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs

44
ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs

@ -141,32 +141,44 @@ namespace ICSharpCode.Decompiler.Disassembler
return $"'{EscapeString(identifier).Replace("'", "\\'")}'"; return $"'{EscapeString(identifier).Replace("'", "\\'")}'";
} }
public static void WriteParameterReference(ITextOutput writer, MetadataReader metadata, MethodDefinitionHandle handle, int sequence) public static void WriteParameterReference(ITextOutput writer, MetadataReader metadata, MethodDefinitionHandle handle, int index)
{ {
var methodDefinition = metadata.GetMethodDefinition(handle); string name = GetParameterName(index);
var signature = methodDefinition.DecodeSignature(new FullTypeNameSignatureDecoder(metadata), default); if (name == null)
var parameters = methodDefinition.GetParameters().Select(p => metadata.GetParameter(p)).ToArray();
var signatureHeader = signature.Header;
int index = sequence;
if (signatureHeader.IsInstance && signature.ParameterTypes.Length == parameters.Length)
{ {
index--; writer.WriteLocalReference(index.ToString(), "param_" + index);
} }
if (index < 0 || index >= parameters.Length) else
{ {
writer.WriteLocalReference(sequence.ToString(), "param_" + index); writer.WriteLocalReference(name, "param_" + index);
} }
else
string GetParameterName(int parameterNumber)
{ {
var param = parameters[index]; var methodDefinition = metadata.GetMethodDefinition(handle);
if (param.Name.IsNil) if ((methodDefinition.Attributes & System.Reflection.MethodAttributes.Static) != 0)
{ {
writer.WriteLocalReference(sequence.ToString(), "param_" + index); parameterNumber++;
} }
else foreach (var p in methodDefinition.GetParameters())
{ {
writer.WriteLocalReference(Escape(metadata.GetString(param.Name)), "param_" + index); var param = metadata.GetParameter(p);
if (param.SequenceNumber < parameterNumber)
{
continue;
}
else if (param.SequenceNumber == parameterNumber)
{
if (param.Name.IsNil)
return null;
return Escape(metadata.GetString(param.Name));
}
else
{
break;
}
} }
return null;
} }
} }

Loading…
Cancel
Save