Browse Source

Fix linking of local variables and parameters to their usages in the IL view.

pull/1464/head
Siegfried Pammer 6 years ago
parent
commit
2a5ba0f665
  1. 8
      ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs
  2. 36
      ICSharpCode.Decompiler/Disassembler/MethodBodyDisassembler.cs
  3. 9
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs
  4. 2
      ICSharpCode.Decompiler/Output/ITextOutput.cs
  5. 4
      ICSharpCode.Decompiler/Output/PlainTextOutput.cs
  6. 13
      ILSpy/TextView/AvalonEditTextOutput.cs

8
ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs

@ -141,20 +141,20 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -141,20 +141,20 @@ namespace ICSharpCode.Decompiler.Disassembler
index--;
}
if (index < 0 || index >= parameters.Length) {
writer.Write(sequence.ToString());
writer.WriteLocalReference(sequence.ToString(), "param_" + index);
} else {
var param = parameters[index];
if (param.Name.IsNil) {
writer.Write(sequence.ToString());
writer.WriteLocalReference(sequence.ToString(), "param_" + index);
} else {
writer.Write(Escape(metadata.GetString(param.Name)));
writer.WriteLocalReference(Escape(metadata.GetString(param.Name)), "param_" + index);
}
}
}
public static void WriteVariableReference(ITextOutput writer, MetadataReader metadata, MethodDefinitionHandle handle, int index)
{
writer.Write(index.ToString());
writer.WriteLocalReference(index.ToString(), "loc_" + index);
}
public static void WriteOperand(ITextOutput writer, object operand)

36
ICSharpCode.Decompiler/Disassembler/MethodBodyDisassembler.cs

@ -151,7 +151,8 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -151,7 +151,8 @@ namespace ICSharpCode.Decompiler.Disassembler
output.Indent();
int index = 0;
foreach (var v in signature) {
output.WriteLocalReference("[" + index + "] ", v, isDefinition: true);
output.WriteLocalReference("[" + index + "]", "loc_" + index, isDefinition: true);
output.Write(' ');
v(ILNameSyntax.TypeName);
if (DebugInfo != null && DebugInfo.TryGetName(method, index, out var name)) {
output.Write(" " + DisassemblerHelpers.Escape(name));
@ -317,7 +318,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -317,7 +318,7 @@ namespace ICSharpCode.Decompiler.Disassembler
output.WriteLocalReference(DisassemblerHelpers.OffsetToString(offset), offset, isDefinition: true);
output.Write(": ");
if (opCode.IsDefined()) {
output.WriteReference(new OpCodeInfo(opCode, opCode.GetDisplayName()));
WriteOpCode(opCode);
switch (opCode.GetOperandType()) {
case OperandType.BrTarget:
case OperandType.ShortBrTarget:
@ -450,6 +451,37 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -450,6 +451,37 @@ namespace ICSharpCode.Decompiler.Disassembler
output.WriteLine();
}
private void WriteOpCode(ILOpCode opCode)
{
var opCodeInfo = new OpCodeInfo(opCode, opCode.GetDisplayName());
string index;
switch (opCode) {
case ILOpCode.Ldarg_0:
case ILOpCode.Ldarg_1:
case ILOpCode.Ldarg_2:
case ILOpCode.Ldarg_3:
output.WriteReference(opCodeInfo, omitSuffix: true);
index = opCodeInfo.Name.Substring(6);
output.WriteLocalReference(index, "param_" + index);
break;
case ILOpCode.Ldloc_0:
case ILOpCode.Ldloc_1:
case ILOpCode.Ldloc_2:
case ILOpCode.Ldloc_3:
case ILOpCode.Stloc_0:
case ILOpCode.Stloc_1:
case ILOpCode.Stloc_2:
case ILOpCode.Stloc_3:
output.WriteReference(opCodeInfo, omitSuffix: true);
index = opCodeInfo.Name.Substring(6);
output.WriteLocalReference(index, "loc_" + index);
break;
default:
output.WriteReference(opCodeInfo);
break;
}
}
private void WriteMetadataToken(EntityHandle handle, bool spaceBefore)
{
WriteMetadataToken(handle, MetadataTokens.GetToken(handle), spaceBefore);

9
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -942,6 +942,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -942,6 +942,7 @@ namespace ICSharpCode.Decompiler.Disassembler
void WriteParameters(MetadataReader metadata, IEnumerable<ParameterHandle> parameters, MethodSignature<Action<ILNameSyntax>> signature)
{
int i = 0;
int offset = signature.Header.IsInstance ? 1 : 0;
foreach (var h in parameters) {
var p = metadata.GetParameter(h);
@ -955,7 +956,8 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -955,7 +956,8 @@ namespace ICSharpCode.Decompiler.Disassembler
output.WriteLine();
}
signature.ParameterTypes[i](ILNameSyntax.Signature);
output.Write(" ''");
output.Write(' ');
output.WriteLocalReference("''", "param_" + (i + offset), isDefinition: true);
i++;
}
@ -978,7 +980,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -978,7 +980,7 @@ namespace ICSharpCode.Decompiler.Disassembler
if (!md.IsNil) {
WriteMarshalInfo(metadata.GetBlobReader(md));
}
output.WriteLocalReference(DisassemblerHelpers.Escape(metadata.GetString(p.Name)), p, isDefinition: true);
output.WriteLocalReference(DisassemblerHelpers.Escape(metadata.GetString(p.Name)), "param_" + (i + offset), isDefinition: true);
i++;
}
@ -989,7 +991,8 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -989,7 +991,8 @@ namespace ICSharpCode.Decompiler.Disassembler
output.WriteLine();
}
signature.ParameterTypes[i](ILNameSyntax.Signature);
output.Write(" ''");
output.Write(' ');
output.WriteLocalReference("''", "param_" + (i + offset), isDefinition: true);
i++;
}

2
ICSharpCode.Decompiler/Output/ITextOutput.cs

@ -31,7 +31,7 @@ namespace ICSharpCode.Decompiler @@ -31,7 +31,7 @@ namespace ICSharpCode.Decompiler
void Write(char ch);
void Write(string text);
void WriteLine();
void WriteReference(OpCodeInfo opCode);
void WriteReference(OpCodeInfo opCode, bool omitSuffix = false);
void WriteReference(PEFile module, EntityHandle handle, string text, bool isDefinition = false);
void WriteReference(IType type, string text, bool isDefinition = false);
void WriteReference(IMember member, string text, bool isDefinition = false);

4
ICSharpCode.Decompiler/Output/PlainTextOutput.cs

@ -102,7 +102,7 @@ namespace ICSharpCode.Decompiler @@ -102,7 +102,7 @@ namespace ICSharpCode.Decompiler
column = 1;
}
public void WriteReference(Disassembler.OpCodeInfo opCode)
public void WriteReference(Disassembler.OpCodeInfo opCode, bool omitSuffix = false)
{
Write(opCode.Name);
}
@ -194,7 +194,7 @@ namespace ICSharpCode.Decompiler @@ -194,7 +194,7 @@ namespace ICSharpCode.Decompiler
actions.Add(target => target.WriteLocalReference(text, reference, isDefinition));
}
public void WriteReference(OpCodeInfo opCode)
public void WriteReference(OpCodeInfo opCode, bool omitSuffix = false)
{
actions.Add(target => target.WriteReference(opCode));
}

13
ILSpy/TextView/AvalonEditTextOutput.cs

@ -210,12 +210,19 @@ namespace ICSharpCode.ILSpy.TextView @@ -210,12 +210,19 @@ namespace ICSharpCode.ILSpy.TextView
}
}
public void WriteReference(Decompiler.Disassembler.OpCodeInfo opCode)
public void WriteReference(Decompiler.Disassembler.OpCodeInfo opCode, bool omitSuffix = false)
{
WriteIndent();
int start = this.TextLength;
b.Append(opCode.Name);
int end = this.TextLength;
if (omitSuffix) {
int lastDot = opCode.Name.LastIndexOf('.');
if (lastDot > 0) {
b.Append(opCode.Name.Remove(lastDot + 1));
}
} else {
b.Append(opCode.Name);
}
int end = this.TextLength - 1;
references.Add(new ReferenceSegment { StartOffset = start, EndOffset = end, Reference = opCode });
}

Loading…
Cancel
Save