Browse Source

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

pull/3063/head
Siegfried Pammer 2 years ago
parent
commit
32242c54a1
  1. 44
      ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs

44
ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs

@ -141,32 +141,44 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -141,32 +141,44 @@ namespace ICSharpCode.Decompiler.Disassembler
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);
var signature = methodDefinition.DecodeSignature(new FullTypeNameSignatureDecoder(metadata), default);
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)
string name = GetParameterName(index);
if (name == null)
{
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];
if (param.Name.IsNil)
var methodDefinition = metadata.GetMethodDefinition(handle);
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