diff --git a/ICSharpCode.Decompiler/IL/Instructions.cs b/ICSharpCode.Decompiler/IL/Instructions.cs
index 44f9a4ed3..1a52fc0a5 100644
--- a/ICSharpCode.Decompiler/IL/Instructions.cs
+++ b/ICSharpCode.Decompiler/IL/Instructions.cs
@@ -699,7 +699,7 @@ namespace ICSharpCode.Decompiler.IL
/// Adds two numbers.
public sealed partial class Add : BinaryNumericInstruction
{
- public Add(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign, CompoundAssignmentType compoundAssignmentType = CompoundAssignmentType.None) : base(OpCode.Add, left, right, checkForOverflow, sign, compoundAssignmentType)
+ public Add(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign) : base(OpCode.Add, left, right, checkForOverflow, sign)
{
}
@@ -716,7 +716,7 @@ namespace ICSharpCode.Decompiler.IL
/// Subtracts two numbers
public sealed partial class Sub : BinaryNumericInstruction
{
- public Sub(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign, CompoundAssignmentType compoundAssignmentType = CompoundAssignmentType.None) : base(OpCode.Sub, left, right, checkForOverflow, sign, compoundAssignmentType)
+ public Sub(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign) : base(OpCode.Sub, left, right, checkForOverflow, sign)
{
}
@@ -733,7 +733,7 @@ namespace ICSharpCode.Decompiler.IL
/// Multiplies two numbers
public sealed partial class Mul : BinaryNumericInstruction
{
- public Mul(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign, CompoundAssignmentType compoundAssignmentType = CompoundAssignmentType.None) : base(OpCode.Mul, left, right, checkForOverflow, sign, compoundAssignmentType)
+ public Mul(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign) : base(OpCode.Mul, left, right, checkForOverflow, sign)
{
}
@@ -750,7 +750,7 @@ namespace ICSharpCode.Decompiler.IL
/// Divides two numbers
public sealed partial class Div : BinaryNumericInstruction
{
- public Div(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign, CompoundAssignmentType compoundAssignmentType = CompoundAssignmentType.None) : base(OpCode.Div, left, right, checkForOverflow, sign, compoundAssignmentType)
+ public Div(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign) : base(OpCode.Div, left, right, checkForOverflow, sign)
{
}
@@ -776,7 +776,7 @@ namespace ICSharpCode.Decompiler.IL
/// Division remainder
public sealed partial class Rem : BinaryNumericInstruction
{
- public Rem(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign, CompoundAssignmentType compoundAssignmentType = CompoundAssignmentType.None) : base(OpCode.Rem, left, right, checkForOverflow, sign, compoundAssignmentType)
+ public Rem(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign) : base(OpCode.Rem, left, right, checkForOverflow, sign)
{
}
@@ -802,7 +802,7 @@ namespace ICSharpCode.Decompiler.IL
/// Bitwise AND
public sealed partial class BitAnd : BinaryNumericInstruction
{
- public BitAnd(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign, CompoundAssignmentType compoundAssignmentType = CompoundAssignmentType.None) : base(OpCode.BitAnd, left, right, checkForOverflow, sign, compoundAssignmentType)
+ public BitAnd(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign) : base(OpCode.BitAnd, left, right, checkForOverflow, sign)
{
}
@@ -819,7 +819,7 @@ namespace ICSharpCode.Decompiler.IL
/// Bitwise OR
public sealed partial class BitOr : BinaryNumericInstruction
{
- public BitOr(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign, CompoundAssignmentType compoundAssignmentType = CompoundAssignmentType.None) : base(OpCode.BitOr, left, right, checkForOverflow, sign, compoundAssignmentType)
+ public BitOr(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign) : base(OpCode.BitOr, left, right, checkForOverflow, sign)
{
}
@@ -836,7 +836,7 @@ namespace ICSharpCode.Decompiler.IL
/// Bitwise XOR
public sealed partial class BitXor : BinaryNumericInstruction
{
- public BitXor(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign, CompoundAssignmentType compoundAssignmentType = CompoundAssignmentType.None) : base(OpCode.BitXor, left, right, checkForOverflow, sign, compoundAssignmentType)
+ public BitXor(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign) : base(OpCode.BitXor, left, right, checkForOverflow, sign)
{
}
@@ -1842,7 +1842,7 @@ namespace ICSharpCode.Decompiler.IL
/// Shift left
public sealed partial class Shl : BinaryNumericInstruction
{
- public Shl(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign, CompoundAssignmentType compoundAssignmentType = CompoundAssignmentType.None) : base(OpCode.Shl, left, right, checkForOverflow, sign, compoundAssignmentType)
+ public Shl(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign) : base(OpCode.Shl, left, right, checkForOverflow, sign)
{
}
@@ -1859,7 +1859,7 @@ namespace ICSharpCode.Decompiler.IL
/// Shift right
public sealed partial class Shr : BinaryNumericInstruction
{
- public Shr(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign, CompoundAssignmentType compoundAssignmentType = CompoundAssignmentType.None) : base(OpCode.Shr, left, right, checkForOverflow, sign, compoundAssignmentType)
+ public Shr(ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign) : base(OpCode.Shr, left, right, checkForOverflow, sign)
{
}
@@ -3896,29 +3896,29 @@ namespace ICSharpCode.Decompiler.IL
partial class BinaryNumericInstruction
{
- public static BinaryNumericInstruction Create(OpCode opCode, ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign, CompoundAssignmentType compoundAssignmentType = CompoundAssignmentType.None)
+ public static BinaryNumericInstruction Create(OpCode opCode, ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign)
{
switch (opCode) {
case OpCode.Add:
- return new Add(left, right, checkForOverflow, sign, compoundAssignmentType);
+ return new Add(left, right, checkForOverflow, sign);
case OpCode.Sub:
- return new Sub(left, right, checkForOverflow, sign, compoundAssignmentType);
+ return new Sub(left, right, checkForOverflow, sign);
case OpCode.Mul:
- return new Mul(left, right, checkForOverflow, sign, compoundAssignmentType);
+ return new Mul(left, right, checkForOverflow, sign);
case OpCode.Div:
- return new Div(left, right, checkForOverflow, sign, compoundAssignmentType);
+ return new Div(left, right, checkForOverflow, sign);
case OpCode.Rem:
- return new Rem(left, right, checkForOverflow, sign, compoundAssignmentType);
+ return new Rem(left, right, checkForOverflow, sign);
case OpCode.BitAnd:
- return new BitAnd(left, right, checkForOverflow, sign, compoundAssignmentType);
+ return new BitAnd(left, right, checkForOverflow, sign);
case OpCode.BitOr:
- return new BitOr(left, right, checkForOverflow, sign, compoundAssignmentType);
+ return new BitOr(left, right, checkForOverflow, sign);
case OpCode.BitXor:
- return new BitXor(left, right, checkForOverflow, sign, compoundAssignmentType);
+ return new BitXor(left, right, checkForOverflow, sign);
case OpCode.Shl:
- return new Shl(left, right, checkForOverflow, sign, compoundAssignmentType);
+ return new Shl(left, right, checkForOverflow, sign);
case OpCode.Shr:
- return new Shr(left, right, checkForOverflow, sign, compoundAssignmentType);
+ return new Shr(left, right, checkForOverflow, sign);
default:
throw new ArgumentException("opCode is not a binary numeric instruction");
}
diff --git a/ICSharpCode.Decompiler/IL/Instructions.tt b/ICSharpCode.Decompiler/IL/Instructions.tt
index b4ac5d811..8d2797cec 100644
--- a/ICSharpCode.Decompiler/IL/Instructions.tt
+++ b/ICSharpCode.Decompiler/IL/Instructions.tt
@@ -303,12 +303,12 @@ namespace ICSharpCode.Decompiler.IL
partial class BinaryNumericInstruction
{
- public static BinaryNumericInstruction Create(OpCode opCode, ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign, CompoundAssignmentType compoundAssignmentType = CompoundAssignmentType.None)
+ public static BinaryNumericInstruction Create(OpCode opCode, ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign)
{
switch (opCode) {
<# foreach (OpCode opCode in opCodes.Where(c => c.BaseClass == "BinaryNumericInstruction")) { #>
case OpCode.<#=opCode.Name#>:
- return new <#=opCode.Name#>(left, right, checkForOverflow, sign, compoundAssignmentType);
+ return new <#=opCode.Name#>(left, right, checkForOverflow, sign);
<# } #>
default:
throw new ArgumentException("opCode is not a binary numeric instruction");
@@ -581,8 +581,6 @@ namespace ICSharpCode.Decompiler.IL
opCode.BaseConstructorArguments.Add("checkForOverflow");
opCode.ConstructorParameters.Add("Sign sign");
opCode.BaseConstructorArguments.Add("sign");
- opCode.ConstructorParameters.Add("CompoundAssignmentType compoundAssignmentType = CompoundAssignmentType.None");
- opCode.BaseConstructorArguments.Add("compoundAssignmentType");
};
static Action CustomArguments(params string[] arguments)
diff --git a/ICSharpCode.Decompiler/IL/Instructions/BinaryNumericInstruction.cs b/ICSharpCode.Decompiler/IL/Instructions/BinaryNumericInstruction.cs
index 7f38f4b25..42eab1d86 100644
--- a/ICSharpCode.Decompiler/IL/Instructions/BinaryNumericInstruction.cs
+++ b/ICSharpCode.Decompiler/IL/Instructions/BinaryNumericInstruction.cs
@@ -33,11 +33,6 @@ namespace ICSharpCode.Decompiler.IL
public abstract partial class BinaryNumericInstruction : BinaryInstruction
{
- ///
- /// Gets whether this instruction is a compound assignment.
- ///
- public readonly CompoundAssignmentType CompoundAssignmentType;
-
///
/// Gets whether the instruction checks for overflow.
///
@@ -52,15 +47,14 @@ namespace ICSharpCode.Decompiler.IL
readonly StackType resultType;
- protected BinaryNumericInstruction(OpCode opCode, ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign, CompoundAssignmentType compoundAssignmentType)
+ protected BinaryNumericInstruction(OpCode opCode, ILInstruction left, ILInstruction right, bool checkForOverflow, Sign sign)
: base(opCode, left, right)
{
this.CheckForOverflow = checkForOverflow;
this.Sign = sign;
- this.CompoundAssignmentType = compoundAssignmentType;
this.resultType = ComputeResultType(opCode, left.ResultType, right.ResultType);
Debug.Assert(resultType != StackType.Unknown);
- Debug.Assert(CompoundAssignmentType == CompoundAssignmentType.None || IsValidCompoundAssignmentTarget(Left));
+ //Debug.Assert(CompoundAssignmentType == CompoundAssignmentType.None || IsValidCompoundAssignmentTarget(Left));
}
internal static bool IsValidCompoundAssignmentTarget(ILInstruction inst)
@@ -108,54 +102,16 @@ namespace ICSharpCode.Decompiler.IL
}
}
- internal override void CheckInvariant(ILPhase phase)
- {
- base.CheckInvariant(phase);
- Debug.Assert(CompoundAssignmentType == CompoundAssignmentType.None || IsValidCompoundAssignmentTarget(Left));
- }
-
- protected override void Connected()
- {
- base.Connected();
- // Count the local variable store due to the compound assignment:
- ILVariable v;
- if (CompoundAssignmentType != CompoundAssignmentType.None && Left.MatchLdLoc(out v)) {
- v.StoreCount++;
- }
- }
-
- protected override void Disconnected()
- {
- base.Disconnected();
- // Count the local variable store due to the compound assignment:
- ILVariable v;
- if (CompoundAssignmentType != CompoundAssignmentType.None && Left.MatchLdLoc(out v)) {
- v.StoreCount--;
- }
- }
-
protected override InstructionFlags ComputeFlags()
{
var flags = base.ComputeFlags();
if (CheckForOverflow)
flags |= InstructionFlags.MayThrow;
- // Set MayWriteLocals if this is a compound assignment to a local variable
- if (CompoundAssignmentType != CompoundAssignmentType.None && Left.OpCode == OpCode.LdLoc)
- flags |= InstructionFlags.MayWriteLocals;
return flags;
}
public override void WriteTo(ITextOutput output)
{
- switch (CompoundAssignmentType) {
- case CompoundAssignmentType.EvaluatesToNewValue:
- output.Write("compound.assign");
- break;
- case CompoundAssignmentType.EvaluatesToOldValue:
- output.Write("compound.assign.oldvalue");
- break;
- }
-
output.Write(OpCode);
if (CheckForOverflow)
output.Write(".ovf");