From 66d1b744c3d160b22d87798645450054ccddc7d3 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 23 Sep 2017 14:54:18 +0200 Subject: [PATCH] Add ILAstWritingOptions parameter to ILInstruction.WriteTo(). --- ICSharpCode.Decompiler/IL/ILReader.cs | 2 +- ICSharpCode.Decompiler/IL/Instructions.cs | 120 +++++++++--------- ICSharpCode.Decompiler/IL/Instructions.tt | 12 +- .../Instructions/BinaryNumericInstruction.cs | 6 +- .../IL/Instructions/Block.cs | 6 +- .../IL/Instructions/BlockContainer.cs | 4 +- .../IL/Instructions/Branch.cs | 2 +- .../IL/Instructions/CallInstruction.cs | 4 +- .../IL/Instructions/Comp.cs | 6 +- .../CompoundAssignmentInstruction.cs | 6 +- .../IL/Instructions/Conv.cs | 4 +- .../IL/Instructions/ILFunction.cs | 4 +- .../IL/Instructions/ILInstruction.cs | 8 +- .../IL/Instructions/IfInstruction.cs | 8 +- .../IL/Instructions/LdLen.cs | 4 +- .../IL/Instructions/Leave.cs | 4 +- .../IL/Instructions/LockInstruction.cs | 14 +- .../Instructions/NullCoalescingInstruction.cs | 6 +- .../IL/Instructions/SimpleInstruction.cs | 8 +- .../IL/Instructions/SwitchInstruction.cs | 12 +- .../IL/Instructions/TryInstruction.cs | 28 ++-- .../IL/Instructions/UnaryInstruction.cs | 11 ++ 22 files changed, 145 insertions(+), 134 deletions(-) diff --git a/ICSharpCode.Decompiler/IL/ILReader.cs b/ICSharpCode.Decompiler/IL/ILReader.cs index cc77ec1eb..74cc3ba8c 100644 --- a/ICSharpCode.Decompiler/IL/ILReader.cs +++ b/ICSharpCode.Decompiler/IL/ILReader.cs @@ -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); diff --git a/ICSharpCode.Decompiler/IL/Instructions.cs b/ICSharpCode.Decompiler/IL/Instructions.cs index 1c0fcff0d..48e809e7a 100644 --- a/ICSharpCode.Decompiler/IL/Instructions.cs +++ b/ICSharpCode.Decompiler/IL/Instructions.cs @@ -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 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 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 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 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 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 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 } 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 } 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 } 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 } 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 } 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 /// Returns the method operand. 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 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 /// Returns the type operand. 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 /// Returns the token operand. 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 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 readonly IField field; /// Returns the field operand. 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 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 /// Returns the type operand. 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 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 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 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 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 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 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 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 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 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 /// Returns the type operand. 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 /// Returns the type operand. 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 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 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 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 /// Returns the type operand. 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 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 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 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 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('('); diff --git a/ICSharpCode.Decompiler/IL/Instructions.tt b/ICSharpCode.Decompiler/IL/Instructions.tt index 7074ac75f..4a809dbbc 100644 --- a/ICSharpCode.Decompiler/IL/Instructions.tt +++ b/ICSharpCode.Decompiler/IL/Instructions.tt @@ -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 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 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 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 " + argProp + " { get; private set; }"); @@ -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 diff --git a/ICSharpCode.Decompiler/IL/Instructions/BinaryNumericInstruction.cs b/ICSharpCode.Decompiler/IL/Instructions/BinaryNumericInstruction.cs index fb82af0ca..bebbbb975 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/BinaryNumericInstruction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/BinaryNumericInstruction.cs @@ -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 output.Write(".lifted"); } output.Write('('); - Left.WriteTo(output); + Left.WriteTo(output, options); output.Write(", "); - Right.WriteTo(output); + Right.WriteTo(output, options); output.Write(')'); } } diff --git a/ICSharpCode.Decompiler/IL/Instructions/Block.cs b/ICSharpCode.Decompiler/IL/Instructions/Block.cs index 4a36a543f..3931beece 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/Block.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/Block.cs @@ -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 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(); diff --git a/ICSharpCode.Decompiler/IL/Instructions/BlockContainer.cs b/ICSharpCode.Decompiler/IL/Instructions/BlockContainer.cs index ead48735b..5cf84221c 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/BlockContainer.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/BlockContainer.cs @@ -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 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); diff --git a/ICSharpCode.Decompiler/IL/Instructions/Branch.cs b/ICSharpCode.Decompiler/IL/Instructions/Branch.cs index aea2885a5..fcd90d7d8 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/Branch.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/Branch.cs @@ -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(' '); diff --git a/ICSharpCode.Decompiler/IL/Instructions/CallInstruction.cs b/ICSharpCode.Decompiler/IL/Instructions/CallInstruction.cs index 5bfd160d0..ff55549f9 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/CallInstruction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/CallInstruction.cs @@ -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 for (int i = 0; i < Arguments.Count; i++) { if (i > 0) output.Write(", "); - Arguments[i].WriteTo(output); + Arguments[i].WriteTo(output, options); } output.Write(')'); } diff --git a/ICSharpCode.Decompiler/IL/Instructions/Comp.cs b/ICSharpCode.Decompiler/IL/Instructions/Comp.cs index db092e3f6..c268934d0 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/Comp.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/Comp.cs @@ -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 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(')'); } diff --git a/ICSharpCode.Decompiler/IL/Instructions/CompoundAssignmentInstruction.cs b/ICSharpCode.Decompiler/IL/Instructions/CompoundAssignmentInstruction.cs index 77acb628e..7096cbab0 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/CompoundAssignmentInstruction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/CompoundAssignmentInstruction.cs @@ -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 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(')'); } } diff --git a/ICSharpCode.Decompiler/IL/Instructions/Conv.cs b/ICSharpCode.Decompiler/IL/Instructions/Conv.cs index cce1c8b5e..8ba33dec9 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/Conv.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/Conv.cs @@ -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 break; } output.Write('('); - Argument.WriteTo(output); + Argument.WriteTo(output, options); output.Write(')'); } diff --git a/ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs b/ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs index d1b73ab5a..9151bf34b 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs @@ -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 } output.MarkFoldEnd(); output.WriteLine(); - body.WriteTo(output); + body.WriteTo(output, options); output.WriteLine(); output.Unindent(); diff --git a/ICSharpCode.Decompiler/IL/Instructions/ILInstruction.cs b/ICSharpCode.Decompiler/IL/Instructions/ILInstruction.cs index 6acf3f046..6d8e5d64a 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/ILInstruction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/ILInstruction.cs @@ -212,12 +212,12 @@ namespace ICSharpCode.Decompiler.IL /// /// Writes the ILAst to the text output. /// - 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 /// StackType UnderlyingResultType { get; } } + + public class ILAstWritingOptions + { + } } diff --git a/ICSharpCode.Decompiler/IL/Instructions/IfInstruction.cs b/ICSharpCode.Decompiler/IL/Instructions/IfInstruction.cs index d540c4d49..77a419349 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/IfInstruction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/IfInstruction.cs @@ -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); } } } diff --git a/ICSharpCode.Decompiler/IL/Instructions/LdLen.cs b/ICSharpCode.Decompiler/IL/Instructions/LdLen.cs index 6075fd941..b654624b0 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/LdLen.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/LdLen.cs @@ -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(')'); } } diff --git a/ICSharpCode.Decompiler/IL/Instructions/Leave.cs b/ICSharpCode.Decompiler/IL/Instructions/Leave.cs index 56d8091ed..d6ab063bd 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/Leave.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/Leave.cs @@ -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(')'); } } diff --git a/ICSharpCode.Decompiler/IL/Instructions/LockInstruction.cs b/ICSharpCode.Decompiler/IL/Instructions/LockInstruction.cs index 815a4393d..4b6f8087b 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/LockInstruction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/LockInstruction.cs @@ -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); } } } diff --git a/ICSharpCode.Decompiler/IL/Instructions/NullCoalescingInstruction.cs b/ICSharpCode.Decompiler/IL/Instructions/NullCoalescingInstruction.cs index e71e69594..fd4385d1d 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/NullCoalescingInstruction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/NullCoalescingInstruction.cs @@ -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(")"); } } diff --git a/ICSharpCode.Decompiler/IL/Instructions/SimpleInstruction.cs b/ICSharpCode.Decompiler/IL/Instructions/SimpleInstruction.cs index 62ac417d2..18f5b6f6f 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/SimpleInstruction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/SimpleInstruction.cs @@ -24,7 +24,7 @@ namespace ICSharpCode.Decompiler.IL /// 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 { 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 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 get { return ExpectedResultType; } } - public override void WriteTo(ITextOutput output) + public override void WriteTo(ITextOutput output, ILAstWritingOptions options) { output.Write(OpCode); if (!string.IsNullOrEmpty(Message)) { diff --git a/ICSharpCode.Decompiler/IL/Instructions/SwitchInstruction.cs b/ICSharpCode.Decompiler/IL/Instructions/SwitchInstruction.cs index 1a2ca24d4..8e22ffe20 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/SwitchInstruction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/SwitchInstruction.cs @@ -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 } } - 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); } } } diff --git a/ICSharpCode.Decompiler/IL/Instructions/TryInstruction.cs b/ICSharpCode.Decompiler/IL/Instructions/TryInstruction.cs index 35b00d029..033d1cba0 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/TryInstruction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/TryInstruction.cs @@ -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 } } - 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 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 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 }; } - 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 { diff --git a/ICSharpCode.Decompiler/IL/Instructions/UnaryInstruction.cs b/ICSharpCode.Decompiler/IL/Instructions/UnaryInstruction.cs index 604d615bd..52d489a0c 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/UnaryInstruction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/UnaryInstruction.cs @@ -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(')'); + } } }