Browse Source

Avoid code duplication when disassembling signature headers.

pull/2176/head
Daniel Grunwald 5 years ago
parent
commit
8573c5282e
  1. 14
      ICSharpCode.Decompiler/Disassembler/DisassemblerSignatureTypeProvider.cs
  2. 35
      ICSharpCode.Decompiler/IL/InstructionOutputExtensions.cs

14
ICSharpCode.Decompiler/Disassembler/DisassemblerSignatureTypeProvider.cs

@ -78,19 +78,7 @@ namespace ICSharpCode.Decompiler.Disassembler
{ {
return syntax => { return syntax => {
output.Write("method "); output.Write("method ");
if (signature.Header.IsInstance) signature.Header.WriteTo(output);
{
output.Write("instance ");
}
if (signature.Header.HasExplicitThis)
{
output.Write("explicit ");
}
if (signature.Header.CallingConvention != SignatureCallingConvention.Default)
{
output.Write(signature.Header.CallingConvention.ToILSyntax());
output.Write(' ');
}
signature.ReturnType(syntax); signature.ReturnType(syntax);
output.Write(" *("); output.Write(" *(");
for (int i = 0; i < signature.ParameterTypes.Length; i++) for (int i = 0; i < signature.ParameterTypes.Length; i++)

35
ICSharpCode.Decompiler/IL/InstructionOutputExtensions.cs

@ -149,7 +149,7 @@ namespace ICSharpCode.Decompiler.IL
{ {
var md = metadata.GetMethodDefinition((MethodDefinitionHandle)entity); var md = metadata.GetMethodDefinition((MethodDefinitionHandle)entity);
methodSignature = md.DecodeSignature(new DisassemblerSignatureTypeProvider(module, output), new Metadata.GenericContext((MethodDefinitionHandle)entity, module)); methodSignature = md.DecodeSignature(new DisassemblerSignatureTypeProvider(module, output), new Metadata.GenericContext((MethodDefinitionHandle)entity, module));
WriteSignatureHeader(output, methodSignature); methodSignature.Header.WriteTo(output);
methodSignature.ReturnType(ILNameSyntax.SignatureNoNamedTypeParameters); methodSignature.ReturnType(ILNameSyntax.SignatureNoNamedTypeParameters);
output.Write(' '); output.Write(' ');
var declaringType = md.GetDeclaringType(); var declaringType = md.GetDeclaringType();
@ -223,7 +223,7 @@ namespace ICSharpCode.Decompiler.IL
{ {
case MemberReferenceKind.Method: case MemberReferenceKind.Method:
methodSignature = mr.DecodeMethodSignature(new DisassemblerSignatureTypeProvider(module, output), genericContext); methodSignature = mr.DecodeMethodSignature(new DisassemblerSignatureTypeProvider(module, output), genericContext);
WriteSignatureHeader(output, methodSignature); methodSignature.Header.WriteTo(output);
methodSignature.ReturnType(ILNameSyntax.SignatureNoNamedTypeParameters); methodSignature.ReturnType(ILNameSyntax.SignatureNoNamedTypeParameters);
output.Write(' '); output.Write(' ');
WriteParent(output, module, metadata, mr.Parent, genericContext, syntax); WriteParent(output, module, metadata, mr.Parent, genericContext, syntax);
@ -250,7 +250,7 @@ namespace ICSharpCode.Decompiler.IL
var methodDefinition = metadata.GetMethodDefinition((MethodDefinitionHandle)ms.Method); var methodDefinition = metadata.GetMethodDefinition((MethodDefinitionHandle)ms.Method);
var methodName = metadata.GetString(methodDefinition.Name); var methodName = metadata.GetString(methodDefinition.Name);
methodSignature = methodDefinition.DecodeSignature(new DisassemblerSignatureTypeProvider(module, output), genericContext); methodSignature = methodDefinition.DecodeSignature(new DisassemblerSignatureTypeProvider(module, output), genericContext);
WriteSignatureHeader(output, methodSignature); methodSignature.Header.WriteTo(output);
methodSignature.ReturnType(ILNameSyntax.SignatureNoNamedTypeParameters); methodSignature.ReturnType(ILNameSyntax.SignatureNoNamedTypeParameters);
output.Write(' '); output.Write(' ');
var declaringType = methodDefinition.GetDeclaringType(); var declaringType = methodDefinition.GetDeclaringType();
@ -275,7 +275,7 @@ namespace ICSharpCode.Decompiler.IL
var memberReference = metadata.GetMemberReference((MemberReferenceHandle)ms.Method); var memberReference = metadata.GetMemberReference((MemberReferenceHandle)ms.Method);
memberName = metadata.GetString(memberReference.Name); memberName = metadata.GetString(memberReference.Name);
methodSignature = memberReference.DecodeMethodSignature(new DisassemblerSignatureTypeProvider(module, output), genericContext); methodSignature = memberReference.DecodeMethodSignature(new DisassemblerSignatureTypeProvider(module, output), genericContext);
WriteSignatureHeader(output, methodSignature); methodSignature.Header.WriteTo(output);
methodSignature.ReturnType(ILNameSyntax.SignatureNoNamedTypeParameters); methodSignature.ReturnType(ILNameSyntax.SignatureNoNamedTypeParameters);
output.Write(' '); output.Write(' ');
WriteParent(output, module, metadata, memberReference.Parent, genericContext, syntax); WriteParent(output, module, metadata, memberReference.Parent, genericContext, syntax);
@ -293,7 +293,7 @@ namespace ICSharpCode.Decompiler.IL
{ {
case SignatureKind.Method: case SignatureKind.Method:
methodSignature = standaloneSig.DecodeMethodSignature(new DisassemblerSignatureTypeProvider(module, output), genericContext); methodSignature = standaloneSig.DecodeMethodSignature(new DisassemblerSignatureTypeProvider(module, output), genericContext);
WriteSignatureHeader(output, methodSignature); methodSignature.Header.WriteTo(output);
methodSignature.ReturnType(ILNameSyntax.SignatureNoNamedTypeParameters); methodSignature.ReturnType(ILNameSyntax.SignatureNoNamedTypeParameters);
WriteParameterList(output, methodSignature); WriteParameterList(output, methodSignature);
break; break;
@ -334,33 +334,20 @@ namespace ICSharpCode.Decompiler.IL
output.Write(")"); output.Write(")");
} }
static void WriteSignatureHeader(ITextOutput output, MethodSignature<Action<ILNameSyntax>> methodSignature) internal static void WriteTo(this in SignatureHeader header, ITextOutput output)
{ {
if (methodSignature.Header.HasExplicitThis) if (header.HasExplicitThis)
{ {
output.Write("instance explicit "); output.Write("instance explicit ");
} }
else if (methodSignature.Header.IsInstance) else if (header.IsInstance)
{ {
output.Write("instance "); output.Write("instance ");
} }
switch (methodSignature.Header.CallingConvention) if (header.CallingConvention != SignatureCallingConvention.Default)
{ {
case SignatureCallingConvention.CDecl: output.Write(header.CallingConvention.ToILSyntax());
output.Write("unmanaged cdecl "); output.Write(' ');
break;
case SignatureCallingConvention.StdCall:
output.Write("unmanaged stdcall ");
break;
case SignatureCallingConvention.ThisCall:
output.Write("unmanaged thiscall ");
break;
case SignatureCallingConvention.FastCall:
output.Write("unmanaged fastcall ");
break;
case SignatureCallingConvention.VarArgs:
output.Write("vararg ");
break;
} }
} }

Loading…
Cancel
Save