Browse Source

Fix parameter output of disassembler. Closes #1214

pull/1420/head
Siegfried Pammer 7 years ago
parent
commit
2a80757e0a
  1. 58
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

58
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -235,14 +235,16 @@ namespace ICSharpCode.Decompiler.Disassembler
signature.ReturnType(ILNameSyntax.Signature); signature.ReturnType(ILNameSyntax.Signature);
output.Write(' '); output.Write(' ');
var parameters = methodDefinition.GetParameters().ToArray(); var parameters = methodDefinition.GetParameters();
if (parameters.Length > 0 && parameters.Length > signature.ParameterTypes.Length) { if (parameters.Count > 0) {
var marshallingDesc = metadata.GetParameter(parameters[0]).GetMarshallingDescriptor(); var firstParam = metadata.GetParameter(parameters.First());
if (firstParam.SequenceNumber == 0) {
var marshallingDesc = firstParam.GetMarshallingDescriptor();
if (!marshallingDesc.IsNil) { if (!marshallingDesc.IsNil) {
WriteMarshalInfo(metadata.GetBlobReader(marshallingDesc)); WriteMarshalInfo(metadata.GetBlobReader(marshallingDesc));
} }
} }
}
if (isCompilerControlled) { if (isCompilerControlled) {
output.Write(DisassemblerHelpers.Escape(metadata.GetString(methodDefinition.Name) + "$PST" + MetadataTokens.GetToken(handle).ToString("X8"))); output.Write(DisassemblerHelpers.Escape(metadata.GetString(methodDefinition.Name) + "$PST" + MetadataTokens.GetToken(handle).ToString("X8")));
@ -932,12 +934,33 @@ namespace ICSharpCode.Decompiler.Disassembler
} }
#endregion #endregion
void WriteParameters(MetadataReader metadata, ParameterHandle[] parameters, MethodSignature<Action<ILNameSyntax>> signature) void WriteParameters(MetadataReader metadata, IEnumerable<ParameterHandle> parameters, MethodSignature<Action<ILNameSyntax>> signature)
{ {
int parameterOffset = parameters.Length > signature.ParameterTypes.Length ? 1 : 0; int i = 0;
for (int i = 0; i < signature.ParameterTypes.Length; i++) {
if (i + parameterOffset < parameters.Length) { foreach (var h in parameters) {
var p = metadata.GetParameter(parameters[i + parameterOffset]); var p = metadata.GetParameter(h);
// skip return type parameter handle
if (p.SequenceNumber == 0) continue;
// fill gaps in parameter list
while (i < p.SequenceNumber - 1) {
if (i > 0) {
output.Write(',');
output.WriteLine();
}
signature.ParameterTypes[i](ILNameSyntax.Signature);
output.Write(" ''");
i++;
}
// separator
if (i > 0) {
output.Write(',');
output.WriteLine();
}
// print parameter
if ((p.Attributes & ParameterAttributes.In) == ParameterAttributes.In) if ((p.Attributes & ParameterAttributes.In) == ParameterAttributes.In)
output.Write("[in] "); output.Write("[in] ");
if ((p.Attributes & ParameterAttributes.Out) == ParameterAttributes.Out) if ((p.Attributes & ParameterAttributes.Out) == ParameterAttributes.Out)
@ -951,14 +974,21 @@ namespace ICSharpCode.Decompiler.Disassembler
WriteMarshalInfo(metadata.GetBlobReader(md)); WriteMarshalInfo(metadata.GetBlobReader(md));
} }
output.WriteLocalReference(DisassemblerHelpers.Escape(metadata.GetString(p.Name)), p, isDefinition: true); output.WriteLocalReference(DisassemblerHelpers.Escape(metadata.GetString(p.Name)), p, isDefinition: true);
} else { i++;
signature.ParameterTypes[i](ILNameSyntax.Signature);
output.Write(" ''");
} }
if (i < signature.ParameterTypes.Length - 1)
// add remaining parameter types as unnamed parameters
while (i < signature.RequiredParameterCount) {
if (i > 0) {
output.Write(','); output.Write(',');
output.WriteLine(); output.WriteLine();
} }
signature.ParameterTypes[i](ILNameSyntax.Signature);
output.Write(" ''");
i++;
}
output.WriteLine();
} }
void WriteGenericParameterAttributes(PEFile module, GenericParameterHandle handle) void WriteGenericParameterAttributes(PEFile module, GenericParameterHandle handle)
@ -1111,7 +1141,7 @@ namespace ICSharpCode.Decompiler.Disassembler
output.WriteLine(); output.WriteLine();
output.Indent(); output.Indent();
WriteParameters(metadata, parameters.Take(parametersCount).ToArray(), signature); WriteParameters(metadata, parameters.Take(parametersCount), signature);
output.Unindent(); output.Unindent();
} }
output.Write(')'); output.Write(')');

Loading…
Cancel
Save