Browse Source

Fix parameter output of disassembler. Closes #1214

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

84
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -235,12 +235,14 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -235,12 +235,14 @@ namespace ICSharpCode.Decompiler.Disassembler
signature.ReturnType(ILNameSyntax.Signature);
output.Write(' ');
var parameters = methodDefinition.GetParameters().ToArray();
if (parameters.Length > 0 && parameters.Length > signature.ParameterTypes.Length) {
var marshallingDesc = metadata.GetParameter(parameters[0]).GetMarshallingDescriptor();
if (!marshallingDesc.IsNil) {
WriteMarshalInfo(metadata.GetBlobReader(marshallingDesc));
var parameters = methodDefinition.GetParameters();
if (parameters.Count > 0) {
var firstParam = metadata.GetParameter(parameters.First());
if (firstParam.SequenceNumber == 0) {
var marshallingDesc = firstParam.GetMarshallingDescriptor();
if (!marshallingDesc.IsNil) {
WriteMarshalInfo(metadata.GetBlobReader(marshallingDesc));
}
}
}
@ -932,33 +934,61 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -932,33 +934,61 @@ namespace ICSharpCode.Decompiler.Disassembler
}
#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;
for (int i = 0; i < signature.ParameterTypes.Length; i++) {
if (i + parameterOffset < parameters.Length) {
var p = metadata.GetParameter(parameters[i + parameterOffset]);
if ((p.Attributes & ParameterAttributes.In) == ParameterAttributes.In)
output.Write("[in] ");
if ((p.Attributes & ParameterAttributes.Out) == ParameterAttributes.Out)
output.Write("[out] ");
if ((p.Attributes & ParameterAttributes.Optional) == ParameterAttributes.Optional)
output.Write("[opt] ");
signature.ParameterTypes[i](ILNameSyntax.Signature);
output.Write(' ');
var md = p.GetMarshallingDescriptor();
if (!md.IsNil) {
WriteMarshalInfo(metadata.GetBlobReader(md));
int i = 0;
foreach (var h in parameters) {
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();
}
output.WriteLocalReference(DisassemblerHelpers.Escape(metadata.GetString(p.Name)), p, isDefinition: true);
} else {
signature.ParameterTypes[i](ILNameSyntax.Signature);
output.Write(" ''");
i++;
}
if (i < signature.ParameterTypes.Length - 1)
// separator
if (i > 0) {
output.Write(',');
output.WriteLine();
output.WriteLine();
}
// print parameter
if ((p.Attributes & ParameterAttributes.In) == ParameterAttributes.In)
output.Write("[in] ");
if ((p.Attributes & ParameterAttributes.Out) == ParameterAttributes.Out)
output.Write("[out] ");
if ((p.Attributes & ParameterAttributes.Optional) == ParameterAttributes.Optional)
output.Write("[opt] ");
signature.ParameterTypes[i](ILNameSyntax.Signature);
output.Write(' ');
var md = p.GetMarshallingDescriptor();
if (!md.IsNil) {
WriteMarshalInfo(metadata.GetBlobReader(md));
}
output.WriteLocalReference(DisassemblerHelpers.Escape(metadata.GetString(p.Name)), p, isDefinition: true);
i++;
}
// add remaining parameter types as unnamed parameters
while (i < signature.RequiredParameterCount) {
if (i > 0) {
output.Write(',');
output.WriteLine();
}
signature.ParameterTypes[i](ILNameSyntax.Signature);
output.Write(" ''");
i++;
}
output.WriteLine();
}
void WriteGenericParameterAttributes(PEFile module, GenericParameterHandle handle)
@ -1111,7 +1141,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -1111,7 +1141,7 @@ namespace ICSharpCode.Decompiler.Disassembler
output.WriteLine();
output.Indent();
WriteParameters(metadata, parameters.Take(parametersCount).ToArray(), signature);
WriteParameters(metadata, parameters.Take(parametersCount), signature);
output.Unindent();
}
output.Write(')');

Loading…
Cancel
Save