Browse Source

Add ILAstWritingOptions parameter to ILInstruction.WriteTo().

pull/870/head
Daniel Grunwald 8 years ago
parent
commit
66d1b744c3
  1. 2
      ICSharpCode.Decompiler/IL/ILReader.cs
  2. 120
      ICSharpCode.Decompiler/IL/Instructions.cs
  3. 12
      ICSharpCode.Decompiler/IL/Instructions.tt
  4. 6
      ICSharpCode.Decompiler/IL/Instructions/BinaryNumericInstruction.cs
  5. 6
      ICSharpCode.Decompiler/IL/Instructions/Block.cs
  6. 4
      ICSharpCode.Decompiler/IL/Instructions/BlockContainer.cs
  7. 2
      ICSharpCode.Decompiler/IL/Instructions/Branch.cs
  8. 4
      ICSharpCode.Decompiler/IL/Instructions/CallInstruction.cs
  9. 6
      ICSharpCode.Decompiler/IL/Instructions/Comp.cs
  10. 6
      ICSharpCode.Decompiler/IL/Instructions/CompoundAssignmentInstruction.cs
  11. 4
      ICSharpCode.Decompiler/IL/Instructions/Conv.cs
  12. 4
      ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs
  13. 8
      ICSharpCode.Decompiler/IL/Instructions/ILInstruction.cs
  14. 8
      ICSharpCode.Decompiler/IL/Instructions/IfInstruction.cs
  15. 4
      ICSharpCode.Decompiler/IL/Instructions/LdLen.cs
  16. 4
      ICSharpCode.Decompiler/IL/Instructions/Leave.cs
  17. 14
      ICSharpCode.Decompiler/IL/Instructions/LockInstruction.cs
  18. 6
      ICSharpCode.Decompiler/IL/Instructions/NullCoalescingInstruction.cs
  19. 8
      ICSharpCode.Decompiler/IL/Instructions/SimpleInstruction.cs
  20. 12
      ICSharpCode.Decompiler/IL/Instructions/SwitchInstruction.cs
  21. 28
      ICSharpCode.Decompiler/IL/Instructions/TryInstruction.cs
  22. 11
      ICSharpCode.Decompiler/IL/Instructions/UnaryInstruction.cs

2
ICSharpCode.Decompiler/IL/ILReader.cs

@ -300,7 +300,7 @@ namespace ICSharpCode.Decompiler.IL @@ -300,7 +300,7 @@ namespace ICSharpCode.Decompiler.IL
output.Write(' ');
output.WriteDefinition("IL_" + inst.ILRange.Start.ToString("x4"), inst.ILRange.Start);
output.Write(": ");
inst.WriteTo(output);
inst.WriteTo(output, new ILAstWritingOptions());
output.WriteLine();
}
new Disassembler.MethodBodyDisassembler(output, false, cancellationToken).WriteExceptionHandlers(body);

120
ICSharpCode.Decompiler/IL/Instructions.cs

@ -281,11 +281,11 @@ namespace ICSharpCode.Decompiler.IL @@ -281,11 +281,11 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.None;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write('(');
this.argument.WriteTo(output);
this.argument.WriteTo(output, options);
output.Write(')');
}
}
@ -373,13 +373,13 @@ namespace ICSharpCode.Decompiler.IL @@ -373,13 +373,13 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.None;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write('(');
this.left.WriteTo(output);
this.left.WriteTo(output, options);
output.Write(", ");
this.right.WriteTo(output);
this.right.WriteTo(output, options);
output.Write(')');
}
}
@ -800,15 +800,15 @@ namespace ICSharpCode.Decompiler.IL @@ -800,15 +800,15 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.MayWriteLocals;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
variable.WriteTo(output);
output.Write('(');
this.init.WriteTo(output);
this.init.WriteTo(output, options);
output.Write(", ");
this.body.WriteTo(output);
this.body.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -1910,7 +1910,7 @@ namespace ICSharpCode.Decompiler.IL @@ -1910,7 +1910,7 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.MayReadLocals;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
@ -1984,7 +1984,7 @@ namespace ICSharpCode.Decompiler.IL @@ -1984,7 +1984,7 @@ namespace ICSharpCode.Decompiler.IL
Debug.Assert(phase <= ILPhase.InILReader || this.IsDescendantOf(variable.Function));
Debug.Assert(phase <= ILPhase.InILReader || variable.Function.Variables[variable.IndexInFunction] == variable);
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
@ -2115,13 +2115,13 @@ namespace ICSharpCode.Decompiler.IL @@ -2115,13 +2115,13 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.MayWriteLocals;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
variable.WriteTo(output);
output.Write('(');
this.value.WriteTo(output);
this.value.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -2209,11 +2209,11 @@ namespace ICSharpCode.Decompiler.IL @@ -2209,11 +2209,11 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.None;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write('(');
this.value.WriteTo(output);
this.value.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -2246,7 +2246,7 @@ namespace ICSharpCode.Decompiler.IL @@ -2246,7 +2246,7 @@ namespace ICSharpCode.Decompiler.IL
}
public readonly string Value;
public override StackType ResultType { get { return StackType.O; } }
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
@ -2282,7 +2282,7 @@ namespace ICSharpCode.Decompiler.IL @@ -2282,7 +2282,7 @@ namespace ICSharpCode.Decompiler.IL
}
public readonly int Value;
public override StackType ResultType { get { return StackType.I4; } }
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
@ -2318,7 +2318,7 @@ namespace ICSharpCode.Decompiler.IL @@ -2318,7 +2318,7 @@ namespace ICSharpCode.Decompiler.IL
}
public readonly long Value;
public override StackType ResultType { get { return StackType.I8; } }
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
@ -2354,7 +2354,7 @@ namespace ICSharpCode.Decompiler.IL @@ -2354,7 +2354,7 @@ namespace ICSharpCode.Decompiler.IL
}
public readonly double Value;
public override StackType ResultType { get { return StackType.F; } }
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
@ -2390,7 +2390,7 @@ namespace ICSharpCode.Decompiler.IL @@ -2390,7 +2390,7 @@ namespace ICSharpCode.Decompiler.IL
}
public readonly decimal Value;
public override StackType ResultType { get { return StackType.O; } }
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
@ -2456,7 +2456,7 @@ namespace ICSharpCode.Decompiler.IL @@ -2456,7 +2456,7 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>Returns the method operand.</summary>
public IMethod Method { get { return method; } }
public override StackType ResultType { get { return StackType.I; } }
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
@ -2503,13 +2503,13 @@ namespace ICSharpCode.Decompiler.IL @@ -2503,13 +2503,13 @@ namespace ICSharpCode.Decompiler.IL
return base.DirectFlags | InstructionFlags.MayThrow;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, method);
output.Write('(');
Argument.WriteTo(output);
Argument.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -2544,7 +2544,7 @@ namespace ICSharpCode.Decompiler.IL @@ -2544,7 +2544,7 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>Returns the type operand.</summary>
public IType Type { get { return type; } }
public override StackType ResultType { get { return StackType.O; } }
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
@ -2582,7 +2582,7 @@ namespace ICSharpCode.Decompiler.IL @@ -2582,7 +2582,7 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>Returns the token operand.</summary>
public IMember Member { get { return member; } }
public override StackType ResultType { get { return StackType.O; } }
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
@ -2715,13 +2715,13 @@ namespace ICSharpCode.Decompiler.IL @@ -2715,13 +2715,13 @@ namespace ICSharpCode.Decompiler.IL
return (DelayExceptions ? InstructionFlags.None : InstructionFlags.MayThrow);
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, field);
output.Write('(');
this.target.WriteTo(output);
this.target.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -2756,7 +2756,7 @@ namespace ICSharpCode.Decompiler.IL @@ -2756,7 +2756,7 @@ namespace ICSharpCode.Decompiler.IL
readonly IField field;
/// <summary>Returns the field operand.</summary>
public IField Field { get { return field; } }
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
@ -2803,13 +2803,13 @@ namespace ICSharpCode.Decompiler.IL @@ -2803,13 +2803,13 @@ namespace ICSharpCode.Decompiler.IL
return base.DirectFlags | InstructionFlags.MayThrow;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('(');
Argument.WriteTo(output);
Argument.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -2844,13 +2844,13 @@ namespace ICSharpCode.Decompiler.IL @@ -2844,13 +2844,13 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>Returns the type operand.</summary>
public IType Type { get { return type; } }
public override StackType ResultType { get { return StackType.O; } }
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('(');
Argument.WriteTo(output);
Argument.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -2946,7 +2946,7 @@ namespace ICSharpCode.Decompiler.IL @@ -2946,7 +2946,7 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.SideEffect | InstructionFlags.MayThrow;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
if (IsVolatile)
output.Write("volatile.");
@ -2956,7 +2956,7 @@ namespace ICSharpCode.Decompiler.IL @@ -2956,7 +2956,7 @@ namespace ICSharpCode.Decompiler.IL
output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('(');
this.target.WriteTo(output);
this.target.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -3070,7 +3070,7 @@ namespace ICSharpCode.Decompiler.IL @@ -3070,7 +3070,7 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.SideEffect | InstructionFlags.MayThrow;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
if (IsVolatile)
output.Write("volatile.");
@ -3080,9 +3080,9 @@ namespace ICSharpCode.Decompiler.IL @@ -3080,9 +3080,9 @@ namespace ICSharpCode.Decompiler.IL
output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('(');
this.target.WriteTo(output);
this.target.WriteTo(output, options);
output.Write(", ");
this.value.WriteTo(output);
this.value.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -3126,13 +3126,13 @@ namespace ICSharpCode.Decompiler.IL @@ -3126,13 +3126,13 @@ namespace ICSharpCode.Decompiler.IL
return base.DirectFlags | InstructionFlags.SideEffect | InstructionFlags.MayThrow;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('(');
Argument.WriteTo(output);
Argument.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -3176,13 +3176,13 @@ namespace ICSharpCode.Decompiler.IL @@ -3176,13 +3176,13 @@ namespace ICSharpCode.Decompiler.IL
return base.DirectFlags | InstructionFlags.MayThrow;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('(');
Argument.WriteTo(output);
Argument.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -3226,13 +3226,13 @@ namespace ICSharpCode.Decompiler.IL @@ -3226,13 +3226,13 @@ namespace ICSharpCode.Decompiler.IL
return base.DirectFlags | InstructionFlags.SideEffect | InstructionFlags.MayThrow;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('(');
Argument.WriteTo(output);
Argument.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -3336,7 +3336,7 @@ namespace ICSharpCode.Decompiler.IL @@ -3336,7 +3336,7 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.MayThrow;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
@ -3345,7 +3345,7 @@ namespace ICSharpCode.Decompiler.IL @@ -3345,7 +3345,7 @@ namespace ICSharpCode.Decompiler.IL
bool first = true;
foreach (var indices in Indices) {
if (!first) output.Write(", "); else first = false;
indices.WriteTo(output);
indices.WriteTo(output, options);
}
output.Write(')');
}
@ -3381,7 +3381,7 @@ namespace ICSharpCode.Decompiler.IL @@ -3381,7 +3381,7 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>Returns the type operand.</summary>
public IType Type { get { return type; } }
public override StackType ResultType { get { return type.GetStackType(); } }
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
@ -3493,7 +3493,7 @@ namespace ICSharpCode.Decompiler.IL @@ -3493,7 +3493,7 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>Returns the type operand.</summary>
public IType Type { get { return type; } }
public override StackType ResultType { get { return StackType.I4; } }
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
@ -3678,7 +3678,7 @@ namespace ICSharpCode.Decompiler.IL @@ -3678,7 +3678,7 @@ namespace ICSharpCode.Decompiler.IL
return (DelayExceptions ? InstructionFlags.None : InstructionFlags.MayThrow);
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
if (IsReadOnly)
output.Write("readonly.");
@ -3686,10 +3686,10 @@ namespace ICSharpCode.Decompiler.IL @@ -3686,10 +3686,10 @@ namespace ICSharpCode.Decompiler.IL
output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('(');
this.array.WriteTo(output);
this.array.WriteTo(output, options);
foreach (var indices in Indices) {
output.Write(", ");
indices.WriteTo(output);
indices.WriteTo(output, options);
}
output.Write(')');
}
@ -3779,11 +3779,11 @@ namespace ICSharpCode.Decompiler.IL @@ -3779,11 +3779,11 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.None;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write('(');
this.array.WriteTo(output);
this.array.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -3818,13 +3818,13 @@ namespace ICSharpCode.Decompiler.IL @@ -3818,13 +3818,13 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>Returns the type operand.</summary>
public IType Type { get { return type; } }
public override StackType ResultType { get { return StackType.O; } }
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('(');
Argument.WriteTo(output);
Argument.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -3896,13 +3896,13 @@ namespace ICSharpCode.Decompiler.IL @@ -3896,13 +3896,13 @@ namespace ICSharpCode.Decompiler.IL
return base.DirectFlags | InstructionFlags.MayThrow;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('(');
Argument.WriteTo(output);
Argument.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -3990,11 +3990,11 @@ namespace ICSharpCode.Decompiler.IL @@ -3990,11 +3990,11 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.MayBranch | InstructionFlags.SideEffect;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write('(');
this.value.WriteTo(output);
this.value.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -4082,11 +4082,11 @@ namespace ICSharpCode.Decompiler.IL @@ -4082,11 +4082,11 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.SideEffect;
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write('(');
this.value.WriteTo(output);
this.value.WriteTo(output, options);
output.Write(')');
}
public override void AcceptVisitor(ILVisitor visitor)
@ -4143,7 +4143,7 @@ namespace ICSharpCode.Decompiler.IL.Patterns @@ -4143,7 +4143,7 @@ namespace ICSharpCode.Decompiler.IL.Patterns
var clone = (AnyNode)ShallowClone();
return clone;
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write('(');

12
ICSharpCode.Decompiler/IL/Instructions.tt

@ -277,7 +277,7 @@ namespace <#=opCode.Namespace#> @@ -277,7 +277,7 @@ namespace <#=opCode.Namespace#>
}
<# } #>
<# if (opCode.GenerateWriteTo) { #>
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{<#=Body(opCode.WriteToBody)#>}
<# } #>
<# if (opCode.GenerateAcceptVisitor) { #>
@ -594,7 +594,7 @@ namespace ICSharpCode.Decompiler.IL @@ -594,7 +594,7 @@ namespace ICSharpCode.Decompiler.IL
opCode.PerformMatchConditions.Add("this.Argument.PerformMatch(o.Argument, ref match)");
opCode.BaseConstructorArguments.Add("argument");
opCode.WriteArguments.Add("output.Write('(');");
opCode.WriteArguments.Add("Argument.WriteTo(output);");
opCode.WriteArguments.Add("Argument.WriteTo(output, options);");
opCode.WriteArguments.Add("output.Write(')');");
};
@ -610,9 +610,9 @@ namespace ICSharpCode.Decompiler.IL @@ -610,9 +610,9 @@ namespace ICSharpCode.Decompiler.IL
opCode.PerformMatchConditions.Add("this.Left.PerformMatch(o.Left, ref match)");
opCode.PerformMatchConditions.Add("this.Right.PerformMatch(o.Right, ref match)");
opCode.WriteArguments.Add("output.Write('(');");
opCode.WriteArguments.Add("Left.WriteTo(output);");
opCode.WriteArguments.Add("Left.WriteTo(output, options);");
opCode.WriteArguments.Add("output.Write(\", \");");
opCode.WriteArguments.Add("Right.WriteTo(output);");
opCode.WriteArguments.Add("Right.WriteTo(output, options);");
opCode.WriteArguments.Add("output.Write(')');");
};
@ -682,7 +682,7 @@ namespace ICSharpCode.Decompiler.IL @@ -682,7 +682,7 @@ namespace ICSharpCode.Decompiler.IL
opCode.WriteArguments.Add("\toutput.Write(\", \");");
else
opCode.WriteArguments.Add("\tif (!first) output.Write(\", \"); else first = false;");
opCode.WriteArguments.Add("\t" + arg + ".WriteTo(output);");
opCode.WriteArguments.Add("\t" + arg + ".WriteTo(output, options);");
opCode.WriteArguments.Add("}");
opCode.Members.Add("public static readonly SlotInfo " + children[i].SlotName + " = " + children[i].GetSlotInit() + ";");
opCode.Members.Add("public InstructionCollection<ILInstruction> " + argProp + " { get; private set; }");
@ -694,7 +694,7 @@ namespace ICSharpCode.Decompiler.IL @@ -694,7 +694,7 @@ namespace ICSharpCode.Decompiler.IL
opCode.PerformMatchConditions.Add("this." + arg + ".PerformMatch(o." + arg + ", ref match)");
if (i > 0)
opCode.WriteArguments.Add("output.Write(\", \");");
opCode.WriteArguments.Add("this." + arg + ".WriteTo(output);");
opCode.WriteArguments.Add("this." + arg + ".WriteTo(output, options);");
opCode.Members.Add("public static readonly SlotInfo " + children[i].SlotName + " = " + children[i].GetSlotInit() + ";");
opCode.Members.Add("ILInstruction " + arg + ";");
opCode.Members.Add("public ILInstruction " + argProp + " {" + Environment.NewLine

6
ICSharpCode.Decompiler/IL/Instructions/BinaryNumericInstruction.cs

@ -176,7 +176,7 @@ namespace ICSharpCode.Decompiler.IL @@ -176,7 +176,7 @@ namespace ICSharpCode.Decompiler.IL
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write("." + GetOperatorName(Operator));
@ -192,9 +192,9 @@ namespace ICSharpCode.Decompiler.IL @@ -192,9 +192,9 @@ namespace ICSharpCode.Decompiler.IL
output.Write(".lifted");
}
output.Write('(');
Left.WriteTo(output);
Left.WriteTo(output, options);
output.Write(", ");
Right.WriteTo(output);
Right.WriteTo(output, options);
output.Write(')');
}
}

6
ICSharpCode.Decompiler/IL/Instructions/Block.cs

@ -124,7 +124,7 @@ namespace ICSharpCode.Decompiler.IL @@ -124,7 +124,7 @@ namespace ICSharpCode.Decompiler.IL
get { return Disassembler.DisassemblerHelpers.OffsetToString(this.ILRange.Start); }
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write("Block ");
output.WriteDefinition(Label, this);
@ -135,12 +135,12 @@ namespace ICSharpCode.Decompiler.IL @@ -135,12 +135,12 @@ namespace ICSharpCode.Decompiler.IL
output.WriteLine(" {");
output.Indent();
foreach (var inst in Instructions) {
inst.WriteTo(output);
inst.WriteTo(output, options);
output.WriteLine();
}
if (finalInstruction.OpCode != OpCode.Nop) {
output.Write("final: ");
finalInstruction.WriteTo(output);
finalInstruction.WriteTo(output, options);
output.WriteLine();
}
output.Unindent();

4
ICSharpCode.Decompiler/IL/Instructions/BlockContainer.cs

@ -105,7 +105,7 @@ namespace ICSharpCode.Decompiler.IL @@ -105,7 +105,7 @@ namespace ICSharpCode.Decompiler.IL
entryPoint.IncomingEdgeCount--;
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.WriteDefinition("BlockContainer", this);
output.Write(' ');
@ -114,7 +114,7 @@ namespace ICSharpCode.Decompiler.IL @@ -114,7 +114,7 @@ namespace ICSharpCode.Decompiler.IL
output.Indent();
foreach (var inst in Blocks) {
if (inst.Parent == this) {
inst.WriteTo(output);
inst.WriteTo(output, options);
} else {
output.Write("stale reference to ");
output.WriteReference(inst.Label, inst, isLocal: true);

2
ICSharpCode.Decompiler/IL/Instructions/Branch.cs

@ -106,7 +106,7 @@ namespace ICSharpCode.Decompiler.IL @@ -106,7 +106,7 @@ namespace ICSharpCode.Decompiler.IL
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(' ');

4
ICSharpCode.Decompiler/IL/Instructions/CallInstruction.cs

@ -74,7 +74,7 @@ namespace ICSharpCode.Decompiler.IL @@ -74,7 +74,7 @@ namespace ICSharpCode.Decompiler.IL
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
if (ConstrainedTo != null) {
output.Write("constrained.");
@ -89,7 +89,7 @@ namespace ICSharpCode.Decompiler.IL @@ -89,7 +89,7 @@ namespace ICSharpCode.Decompiler.IL
for (int i = 0; i < Arguments.Count; i++) {
if (i > 0)
output.Write(", ");
Arguments[i].WriteTo(output);
Arguments[i].WriteTo(output, options);
}
output.Write(')');
}

6
ICSharpCode.Decompiler/IL/Instructions/Comp.cs

@ -173,7 +173,7 @@ namespace ICSharpCode.Decompiler.IL @@ -173,7 +173,7 @@ namespace ICSharpCode.Decompiler.IL
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
switch (Sign) {
@ -193,11 +193,11 @@ namespace ICSharpCode.Decompiler.IL @@ -193,11 +193,11 @@ namespace ICSharpCode.Decompiler.IL
break;
}
output.Write('(');
Left.WriteTo(output);
Left.WriteTo(output, options);
output.Write(' ');
output.Write(Kind.GetToken());
output.Write(' ');
Right.WriteTo(output);
Right.WriteTo(output, options);
output.Write(')');
}

6
ICSharpCode.Decompiler/IL/Instructions/CompoundAssignmentInstruction.cs

@ -123,7 +123,7 @@ namespace ICSharpCode.Decompiler.IL @@ -123,7 +123,7 @@ namespace ICSharpCode.Decompiler.IL
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write("." + GetOperatorName(Operator));
@ -138,9 +138,9 @@ namespace ICSharpCode.Decompiler.IL @@ -138,9 +138,9 @@ namespace ICSharpCode.Decompiler.IL
else if (Sign == Sign.Signed)
output.Write(".signed");
output.Write('(');
Target.WriteTo(output);
Target.WriteTo(output, options);
output.Write(", ");
Value.WriteTo(output);
Value.WriteTo(output, options);
output.Write(')');
}
}

4
ICSharpCode.Decompiler/IL/Instructions/Conv.cs

@ -258,7 +258,7 @@ namespace ICSharpCode.Decompiler.IL @@ -258,7 +258,7 @@ namespace ICSharpCode.Decompiler.IL
get => TargetType.GetStackType();
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
if (CheckForOverflow) {
@ -289,7 +289,7 @@ namespace ICSharpCode.Decompiler.IL @@ -289,7 +289,7 @@ namespace ICSharpCode.Decompiler.IL
break;
}
output.Write('(');
Argument.WriteTo(output);
Argument.WriteTo(output, options);
output.Write(')');
}

4
ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs

@ -78,7 +78,7 @@ namespace ICSharpCode.Decompiler.IL @@ -78,7 +78,7 @@ namespace ICSharpCode.Decompiler.IL
throw new NotImplementedException();
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
if (Method != null) {
@ -102,7 +102,7 @@ namespace ICSharpCode.Decompiler.IL @@ -102,7 +102,7 @@ namespace ICSharpCode.Decompiler.IL
}
output.MarkFoldEnd();
output.WriteLine();
body.WriteTo(output);
body.WriteTo(output, options);
output.WriteLine();
output.Unindent();

8
ICSharpCode.Decompiler/IL/Instructions/ILInstruction.cs

@ -212,12 +212,12 @@ namespace ICSharpCode.Decompiler.IL @@ -212,12 +212,12 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>
/// Writes the ILAst to the text output.
/// </summary>
public abstract void WriteTo(ITextOutput output);
public abstract void WriteTo(ITextOutput output, ILAstWritingOptions options);
public override string ToString()
{
var output = new PlainTextOutput();
WriteTo(output);
WriteTo(output, new ILAstWritingOptions());
if (!ILRange.IsEmpty) {
output.Write(" at IL_" + ILRange.Start.ToString("x4"));
}
@ -740,4 +740,8 @@ namespace ICSharpCode.Decompiler.IL @@ -740,4 +740,8 @@ namespace ICSharpCode.Decompiler.IL
/// </summary>
StackType UnderlyingResultType { get; }
}
public class ILAstWritingOptions
{
}
}

8
ICSharpCode.Decompiler/IL/Instructions/IfInstruction.cs

@ -76,16 +76,16 @@ namespace ICSharpCode.Decompiler.IL @@ -76,16 +76,16 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.ControlFlow | condition.Flags | SemanticHelper.CombineBranches(trueInst.Flags, falseInst.Flags);
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write(" (");
condition.WriteTo(output);
condition.WriteTo(output, options);
output.Write(") ");
trueInst.WriteTo(output);
trueInst.WriteTo(output, options);
if (falseInst.OpCode != OpCode.Nop) {
output.Write(" else ");
falseInst.WriteTo(output);
falseInst.WriteTo(output, options);
}
}
}

4
ICSharpCode.Decompiler/IL/Instructions/LdLen.cs

@ -38,13 +38,13 @@ namespace ICSharpCode.Decompiler.IL @@ -38,13 +38,13 @@ namespace ICSharpCode.Decompiler.IL
get { return resultType; }
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write('.');
output.Write(resultType);
output.Write('(');
this.array.WriteTo(output);
this.array.WriteTo(output, options);
output.Write(')');
}
}

4
ICSharpCode.Decompiler/IL/Instructions/Leave.cs

@ -100,14 +100,14 @@ namespace ICSharpCode.Decompiler.IL @@ -100,14 +100,14 @@ namespace ICSharpCode.Decompiler.IL
Debug.Assert(phase <= ILPhase.InILReader || value.ResultType == targetContainer.ResultType);
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
if (targetContainer != null) {
output.Write(' ');
output.WriteReference(TargetLabel, targetContainer, isLocal: true);
output.Write(" (");
value.WriteTo(output);
value.WriteTo(output, options);
output.Write(')');
}
}

14
ICSharpCode.Decompiler/IL/Instructions/LockInstruction.cs

@ -17,16 +17,12 @@ namespace ICSharpCode.Decompiler.IL @@ -17,16 +17,12 @@ namespace ICSharpCode.Decompiler.IL
public override StackType ResultType => StackType.Void;
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(".lock (");
OnExpression.WriteTo(output);
output.WriteLine(") {");
output.Indent();
Body.WriteTo(output);
output.Unindent();
output.WriteLine();
output.Write("}");
output.Write("lock (");
OnExpression.WriteTo(output, options);
output.WriteLine(") ");
Body.WriteTo(output, options);
}
}
}

6
ICSharpCode.Decompiler/IL/Instructions/NullCoalescingInstruction.cs

@ -89,13 +89,13 @@ namespace ICSharpCode.Decompiler.IL @@ -89,13 +89,13 @@ namespace ICSharpCode.Decompiler.IL
| SemanticHelper.CombineBranches(InstructionFlags.None, fallbackInst.Flags);
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
output.Write("(");
valueInst.WriteTo(output);
valueInst.WriteTo(output, options);
output.Write(", ");
fallbackInst.WriteTo(output);
fallbackInst.WriteTo(output, options);
output.Write(")");
}
}

8
ICSharpCode.Decompiler/IL/Instructions/SimpleInstruction.cs

@ -24,7 +24,7 @@ namespace ICSharpCode.Decompiler.IL @@ -24,7 +24,7 @@ namespace ICSharpCode.Decompiler.IL
/// </summary>
public abstract partial class SimpleInstruction : ILInstruction
{
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
// the non-custom WriteTo would add useless parentheses
@ -35,7 +35,7 @@ namespace ICSharpCode.Decompiler.IL @@ -35,7 +35,7 @@ namespace ICSharpCode.Decompiler.IL
{
public string Comment;
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
if (!string.IsNullOrEmpty(Comment)) {
@ -58,7 +58,7 @@ namespace ICSharpCode.Decompiler.IL @@ -58,7 +58,7 @@ namespace ICSharpCode.Decompiler.IL
get { return ExpectedResultType; }
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
if (!string.IsNullOrEmpty(Message)) {
@ -84,7 +84,7 @@ namespace ICSharpCode.Decompiler.IL @@ -84,7 +84,7 @@ namespace ICSharpCode.Decompiler.IL
get { return ExpectedResultType; }
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
if (!string.IsNullOrEmpty(Message)) {

12
ICSharpCode.Decompiler/IL/Instructions/SwitchInstruction.cs

@ -79,19 +79,19 @@ namespace ICSharpCode.Decompiler.IL @@ -79,19 +79,19 @@ namespace ICSharpCode.Decompiler.IL
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write("switch (");
value.WriteTo(output);
value.WriteTo(output, options);
output.Write(") ");
output.MarkFoldStart("{...}");
output.WriteLine("{");
output.Indent();
output.Write("default: ");
defaultBody.WriteTo(output);
defaultBody.WriteTo(output, options);
output.WriteLine();
foreach (var section in this.Sections) {
section.WriteTo(output);
section.WriteTo(output, options);
output.WriteLine();
}
output.Unindent();
@ -175,13 +175,13 @@ namespace ICSharpCode.Decompiler.IL @@ -175,13 +175,13 @@ namespace ICSharpCode.Decompiler.IL
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write("case ");
output.Write(Labels.ToString());
output.Write(": ");
body.WriteTo(output);
body.WriteTo(output, options);
}
}
}

28
ICSharpCode.Decompiler/IL/Instructions/TryInstruction.cs

@ -65,13 +65,13 @@ namespace ICSharpCode.Decompiler.IL @@ -65,13 +65,13 @@ namespace ICSharpCode.Decompiler.IL
return clone;
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(".try ");
TryBlock.WriteTo(output);
TryBlock.WriteTo(output, options);
foreach (var handler in Handlers) {
output.Write(' ');
handler.WriteTo(output);
handler.WriteTo(output, options);
}
}
@ -159,7 +159,7 @@ namespace ICSharpCode.Decompiler.IL @@ -159,7 +159,7 @@ namespace ICSharpCode.Decompiler.IL
}
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write("catch ");
if (variable != null) {
@ -167,11 +167,11 @@ namespace ICSharpCode.Decompiler.IL @@ -167,11 +167,11 @@ namespace ICSharpCode.Decompiler.IL
output.Write(" : ");
Disassembler.DisassemblerHelpers.WriteOperand(output, variable.Type);
}
output.Write(" if (");
filter.WriteTo(output);
output.Write(" when (");
filter.WriteTo(output, options);
output.Write(')');
output.Write(' ');
body.WriteTo(output);
body.WriteTo(output, options);
}
}
@ -199,13 +199,13 @@ namespace ICSharpCode.Decompiler.IL @@ -199,13 +199,13 @@ namespace ICSharpCode.Decompiler.IL
ILRange = this.ILRange
};
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(".try ");
TryBlock.WriteTo(output);
TryBlock.WriteTo(output, options);
output.Write(" finally ");
finallyBlock.WriteTo(output);
finallyBlock.WriteTo(output, options);
}
public override StackType ResultType {
@ -295,12 +295,12 @@ namespace ICSharpCode.Decompiler.IL @@ -295,12 +295,12 @@ namespace ICSharpCode.Decompiler.IL
};
}
public override void WriteTo(ITextOutput output)
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(".try ");
TryBlock.WriteTo(output);
TryBlock.WriteTo(output, options);
output.Write(" fault ");
faultBlock.WriteTo(output);
faultBlock.WriteTo(output, options);
}
public override StackType ResultType {

11
ICSharpCode.Decompiler/IL/Instructions/UnaryInstruction.cs

@ -48,5 +48,16 @@ namespace ICSharpCode.Decompiler.IL @@ -48,5 +48,16 @@ namespace ICSharpCode.Decompiler.IL
Debug.Assert(IsLifted == (ResultType == StackType.O));
Debug.Assert(IsLifted || ResultType == UnderlyingResultType);
}
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
if (IsLifted) {
output.Write(".lifted");
}
output.Write('(');
this.Argument.WriteTo(output, options);
output.Write(')');
}
}
}

Loading…
Cancel
Save