Skip to content

Commit 0cdac3f

Browse files
Fix #3056: WriteParameterReference was using the wrong parameter definition in static methods.
1 parent c04dff7 commit 0cdac3f

File tree

1 file changed

+28
-16
lines changed

1 file changed

+28
-16
lines changed

ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -141,32 +141,44 @@ public static string Escape(string identifier)
141141
return $"'{EscapeString(identifier).Replace("'", "\\'")}'";
142142
}
143143

144-
public static void WriteParameterReference(ITextOutput writer, MetadataReader metadata, MethodDefinitionHandle handle, int sequence)
144+
public static void WriteParameterReference(ITextOutput writer, MetadataReader metadata, MethodDefinitionHandle handle, int index)
145145
{
146-
var methodDefinition = metadata.GetMethodDefinition(handle);
147-
var signature = methodDefinition.DecodeSignature(new FullTypeNameSignatureDecoder(metadata), default);
148-
var parameters = methodDefinition.GetParameters().Select(p => metadata.GetParameter(p)).ToArray();
149-
var signatureHeader = signature.Header;
150-
int index = sequence;
151-
if (signatureHeader.IsInstance && signature.ParameterTypes.Length == parameters.Length)
146+
string name = GetParameterName(index);
147+
if (name == null)
152148
{
153-
index--;
149+
writer.WriteLocalReference(index.ToString(), "param_" + index);
154150
}
155-
if (index < 0 || index >= parameters.Length)
151+
else
156152
{
157-
writer.WriteLocalReference(sequence.ToString(), "param_" + index);
153+
writer.WriteLocalReference(name, "param_" + index);
158154
}
159-
else
155+
156+
string GetParameterName(int parameterNumber)
160157
{
161-
var param = parameters[index];
162-
if (param.Name.IsNil)
158+
var methodDefinition = metadata.GetMethodDefinition(handle);
159+
if ((methodDefinition.Attributes & System.Reflection.MethodAttributes.Static) != 0)
163160
{
164-
writer.WriteLocalReference(sequence.ToString(), "param_" + index);
161+
parameterNumber++;
165162
}
166-
else
163+
foreach (var p in methodDefinition.GetParameters())
167164
{
168-
writer.WriteLocalReference(Escape(metadata.GetString(param.Name)), "param_" + index);
165+
var param = metadata.GetParameter(p);
166+
if (param.SequenceNumber < parameterNumber)
167+
{
168+
continue;
169+
}
170+
else if (param.SequenceNumber == parameterNumber)
171+
{
172+
if (param.Name.IsNil)
173+
return null;
174+
return Escape(metadata.GetString(param.Name));
175+
}
176+
else
177+
{
178+
break;
179+
}
169180
}
181+
return null;
170182
}
171183
}
172184

0 commit comments

Comments
 (0)