Browse Source

Show metadata tokens in disassembly.

pull/1198/head
Daniel Grunwald 7 years ago
parent
commit
4e449de58d
  1. 35
      ICSharpCode.Decompiler/Disassembler/MethodBodyDisassembler.cs
  2. 16
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs
  3. 1
      ILSpy/Languages/ILLanguage.cs
  4. 4
      ILSpy/TextView/ILAsm-Mode.xshd

35
ICSharpCode.Decompiler/Disassembler/MethodBodyDisassembler.cs

@ -46,6 +46,11 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -46,6 +46,11 @@ namespace ICSharpCode.Decompiler.Disassembler
/// </summary>
public bool ShowSequencePoints { get; set; }
/// <summary>
/// Show metadata tokens for instructions with token operands.
/// </summary>
public bool ShowMetadataTokens { get; set; }
IList<Metadata.SequencePoint> sequencePoints;
int nextSequencePointIndex;
@ -107,7 +112,12 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -107,7 +112,12 @@ namespace ICSharpCode.Decompiler.Disassembler
void DisassembleLocalsBlock(MethodBodyBlock body)
{
if (body.LocalSignature.IsNil) return;
if (body.LocalSignature.IsNil)
return;
output.Write(".locals");
WriteMetadataToken(body.LocalSignature, spaceBefore: true);
if (body.LocalVariablesInitialized)
output.Write(" init");
var blob = metadata.GetStandaloneSignature(body.LocalSignature);
if (blob.GetKind() != StandaloneSignatureKind.LocalVariables)
return;
@ -118,10 +128,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -118,10 +128,7 @@ namespace ICSharpCode.Decompiler.Disassembler
if (reader.ReadCompressedInteger() == 0)
return;
var signature = blob.DecodeLocalSignature(signatureDecoder, genericContext);
if (!signature.IsEmpty) {
output.Write(".locals ");
if (body.LocalVariablesInitialized)
output.Write("init ");
output.Write(' ');
output.WriteLine("(");
output.Indent();
int index = 0;
@ -136,7 +143,6 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -136,7 +143,6 @@ namespace ICSharpCode.Decompiler.Disassembler
output.Unindent();
output.WriteLine(")");
}
}
internal void WriteExceptionHandlers(PEFile module, MethodDefinitionHandle handle, MethodBodyBlock body)
{
@ -305,6 +311,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -305,6 +311,7 @@ namespace ICSharpCode.Decompiler.Disassembler
output.Write(' ');
var handle = MetadataTokens.EntityHandle(blob.ReadInt32());
handle.WriteTo(module, output, genericContext);
WriteMetadataToken(handle, spaceBefore: true);
break;
case OperandType.Tok:
output.Write(' ');
@ -325,6 +332,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -325,6 +332,7 @@ namespace ICSharpCode.Decompiler.Disassembler
break;
}
handle.WriteTo(module, output, genericContext);
WriteMetadataToken(handle, spaceBefore: true);
break;
case OperandType.ShortI:
output.Write(' ');
@ -347,9 +355,10 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -347,9 +355,10 @@ namespace ICSharpCode.Decompiler.Disassembler
DisassemblerHelpers.WriteOperand(output, blob.ReadDouble());
break;
case OperandType.String:
var userString = metadata.GetUserString(MetadataTokens.UserStringHandle(blob.ReadInt32()));
var userString = MetadataTokens.UserStringHandle(blob.ReadInt32());
output.Write(' ');
DisassemblerHelpers.WriteOperand(output, userString);
DisassemblerHelpers.WriteOperand(output, metadata.GetUserString(userString));
WriteMetadataToken(userString, spaceBefore: true);
break;
case OperandType.Switch:
int[] targets = ILParser.DecodeSwitchTargets(ref blob);
@ -385,5 +394,15 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -385,5 +394,15 @@ namespace ICSharpCode.Decompiler.Disassembler
}
output.WriteLine();
}
private void WriteMetadataToken(Handle handle, bool spaceBefore)
{
if (ShowMetadataTokens) {
if (spaceBefore) {
output.Write(' ');
}
output.Write("/* {0:X8} */", MetadataTokens.GetToken(handle));
}
}
}
}

16
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -50,6 +50,11 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -50,6 +50,11 @@ namespace ICSharpCode.Decompiler.Disassembler
set => methodBodyDisassembler.ShowSequencePoints = value;
}
public bool ShowMetadataTokens {
get => methodBodyDisassembler.ShowMetadataTokens;
set => methodBodyDisassembler.ShowMetadataTokens = value;
}
public bool ExpandMemberDefinitions { get; set; } = false;
public ReflectionDisassembler(ITextOutput output, CancellationToken cancellationToken)
@ -139,6 +144,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -139,6 +144,7 @@ namespace ICSharpCode.Decompiler.Disassembler
void DisassembleMethodHeaderInternal(PEFile module, MethodDefinitionHandle handle, MetadataReader metadata, GenericContext genericContext)
{
WriteMetadataToken(handle, spaceAfter:true);
var methodDefinition = metadata.GetMethodDefinition(handle);
// .method public hidebysig specialname
// instance default class [mscorlib]System.IO.TextWriter get_BaseWriter () cil managed
@ -256,6 +262,16 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -256,6 +262,16 @@ namespace ICSharpCode.Decompiler.Disassembler
output.Unindent();
}
private void WriteMetadataToken(Handle handle, bool spaceAfter)
{
if (ShowMetadataTokens) {
output.Write("/* {0:X8} */", MetadataTokens.GetToken(handle));
if (spaceAfter) {
output.Write(' ');
}
}
}
void DisassembleMethodBlock(PEFile module, MethodDefinitionHandle handle, MetadataReader metadata, GenericContext genericContext)
{
var methodDefinition = metadata.GetMethodDefinition(handle);

1
ILSpy/Languages/ILLanguage.cs

@ -54,6 +54,7 @@ namespace ICSharpCode.ILSpy @@ -54,6 +54,7 @@ namespace ICSharpCode.ILSpy
return new ReflectionDisassembler(output, options.CancellationToken) {
DetectControlStructure = detectControlStructure,
ShowSequencePoints = options.DecompilerSettings.ShowDebugInfo,
ShowMetadataTokens = Options.DisplaySettingsPanel.CurrentDisplaySettings.ShowMetadataTokens,
ExpandMemberDefinitions = options.DecompilerSettings.ExpandMemberDefinitions
};
}

4
ILSpy/TextView/ILAsm-Mode.xshd

@ -500,6 +500,10 @@ @@ -500,6 +500,10 @@
<Span color="Comment" ruleSet="CommentMarkerSet">
<Begin>//</Begin>
</Span>
<Span color="Comment" ruleSet="CommentMarkerSet">
<Begin>/\*</Begin>
<End>\*/</End>
</Span>
<Span color="String">
<Begin>"</Begin>
<End>"</End>

Loading…
Cancel
Save