Browse Source

Minor improvements to disassembler.

pull/1/head
Daniel Grunwald 15 years ago
parent
commit
a0f0a5f5ab
  1. 24
      ILSpy/Disassembler/DisassemblerHelpers.cs
  2. 24
      ILSpy/Disassembler/ILLanguage.cs
  3. 16
      ILSpy/ExtensionMethods.cs

24
ILSpy/Disassembler/DisassemblerHelpers.cs

@ -25,23 +25,23 @@ namespace ICSharpCode.ILSpy.Disassembler @@ -25,23 +25,23 @@ namespace ICSharpCode.ILSpy.Disassembler
{
static class DisassemblerHelpers
{
static void WriteOffsetReference(ITextOutput writer, int offset)
static void WriteOffsetReference(ITextOutput writer, Instruction instruction)
{
writer.WriteReference(CecilExtensions.OffsetToString(offset), offset);
writer.WriteReference(CecilExtensions.OffsetToString(instruction.Offset), instruction);
}
public static void WriteTo(this ExceptionHandler exceptionHandler, ITextOutput writer)
{
writer.Write("Try ");
WriteOffsetReference(writer, exceptionHandler.TryStart.Offset);
WriteOffsetReference(writer, exceptionHandler.TryStart);
writer.Write('-');
WriteOffsetReference(writer, exceptionHandler.TryEnd.Offset);
WriteOffsetReference(writer, exceptionHandler.TryEnd);
writer.Write(exceptionHandler.HandlerType.ToString());
if (exceptionHandler.FilterStart != null) {
writer.Write(' ');
WriteOffsetReference(writer, exceptionHandler.FilterStart.Offset);
WriteOffsetReference(writer, exceptionHandler.FilterStart);
writer.Write('-');
WriteOffsetReference(writer, exceptionHandler.FilterEnd.Offset);
WriteOffsetReference(writer, exceptionHandler.FilterEnd);
writer.Write(" handler ");
}
if (exceptionHandler.CatchType != null) {
@ -49,14 +49,14 @@ namespace ICSharpCode.ILSpy.Disassembler @@ -49,14 +49,14 @@ namespace ICSharpCode.ILSpy.Disassembler
exceptionHandler.CatchType.WriteTo(writer);
}
writer.Write(' ');
WriteOffsetReference(writer, exceptionHandler.HandlerStart.Offset);
WriteOffsetReference(writer, exceptionHandler.HandlerStart);
writer.Write('-');
WriteOffsetReference(writer, exceptionHandler.HandlerEnd.Offset);
WriteOffsetReference(writer, exceptionHandler.HandlerEnd);
}
public static void WriteTo(this Instruction instruction, ITextOutput writer)
{
writer.WriteDefinition(CecilExtensions.OffsetToString(instruction.Offset), instruction.Offset);
writer.WriteDefinition(CecilExtensions.OffsetToString(instruction.Offset), instruction);
writer.Write(": ");
writer.Write(instruction.OpCode.Name);
if(null != instruction.Operand) {
@ -70,7 +70,7 @@ namespace ICSharpCode.ILSpy.Disassembler @@ -70,7 +70,7 @@ namespace ICSharpCode.ILSpy.Disassembler
writer.Write("(");
for(int i = 0; i < instructions.Length; i++) {
if(i != 0) writer.Write(", ");
WriteOffsetReference(writer, instructions[i].Offset);
WriteOffsetReference(writer, instructions[i]);
}
writer.Write(")");
}
@ -108,7 +108,7 @@ namespace ICSharpCode.ILSpy.Disassembler @@ -108,7 +108,7 @@ namespace ICSharpCode.ILSpy.Disassembler
writer.WriteReference(field.Name, field);
}
static void WriteTo(this TypeReference type, ITextOutput writer)
public static void WriteTo(this TypeReference type, ITextOutput writer)
{
string name = ShortTypeName(type);
if (name != null)
@ -124,7 +124,7 @@ namespace ICSharpCode.ILSpy.Disassembler @@ -124,7 +124,7 @@ namespace ICSharpCode.ILSpy.Disassembler
Instruction targetInstruction = operand as Instruction;
if (targetInstruction != null) {
WriteOffsetReference(writer, targetInstruction.Offset);
WriteOffsetReference(writer, targetInstruction);
return;
}

24
ILSpy/Disassembler/ILLanguage.cs

@ -29,6 +29,30 @@ namespace ICSharpCode.ILSpy.Disassembler @@ -29,6 +29,30 @@ namespace ICSharpCode.ILSpy.Disassembler
public override void Decompile(MethodDefinition method, ITextOutput output)
{
output.WriteComment("// Method begins at RVA 0x{0:x4}", method.RVA);
output.WriteLine();
output.WriteComment("// Code size {0} (0x{0:x})", method.Body.CodeSize);
output.WriteLine();
output.WriteLine(".maxstack {0}", method.Body.MaxStackSize);
if (method.DeclaringType.Module.Assembly.EntryPoint == method)
output.WriteLine (".entrypoint");
if (method.Body.HasVariables) {
output.Write(".locals ");
if (method.Body.InitLocals)
output.Write("init ");
output.WriteLine("(");
output.Indent();
foreach (var v in method.Body.Variables) {
v.VariableType.WriteTo(output);
output.Write(' ');
output.WriteDefinition(string.IsNullOrEmpty(v.Name) ? v.Index.ToString() : v.Name, v);
output.WriteLine();
}
output.Unindent();
output.WriteLine(")");
}
foreach (var inst in method.Body.Instructions) {
inst.WriteTo(output);
output.WriteLine();

16
ILSpy/ExtensionMethods.cs

@ -39,6 +39,22 @@ namespace ICSharpCode.ILSpy @@ -39,6 +39,22 @@ namespace ICSharpCode.ILSpy
output.Write(string.Format(format, args));
}
public static void WriteLine(this ITextOutput output, string text)
{
output.Write(text);
output.WriteLine();
}
public static void WriteLine(this ITextOutput output, string format, params object[] args)
{
output.WriteLine(string.Format(format, args));
}
public static void WriteComment(this ITextOutput output, string format, params object[] args)
{
output.WriteComment(string.Format(format, args));
}
/// <summary>
/// Sets the value of a dependency property on <paramref name="targetObject"/> using a markup extension.
/// </summary>

Loading…
Cancel
Save