From 32242c54a17a385afcd9472bd700394b75b9ea88 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 26 Aug 2023 11:49:06 +0200 Subject: [PATCH] Fix #3056: WriteParameterReference was using the wrong parameter definition in static methods. --- .../Disassembler/DisassemblerHelpers.cs | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs b/ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs index 6bc2e5e5e..89adb046b 100644 --- a/ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs +++ b/ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs @@ -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; } }