Create instances of common constants
This commit is contained in:
parent
91559b95e4
commit
91cc161a9d
|
@ -78,10 +78,10 @@ namespace de4dot.blocks.cflow {
|
|||
case ElementType.U2:
|
||||
case ElementType.I4:
|
||||
case ElementType.U4:
|
||||
return new Int32Value(0);
|
||||
return Int32Value.zero;
|
||||
case ElementType.I8:
|
||||
case ElementType.U8:
|
||||
return new Int64Value(0);
|
||||
return Int64Value.zero;
|
||||
case ElementType.R4:
|
||||
case ElementType.R8:
|
||||
return new Real8Value(0);
|
||||
|
@ -278,8 +278,8 @@ namespace de4dot.blocks.cflow {
|
|||
case Code.Ldc_I8: valueStack.push(new Int64Value((long)instr.Operand)); break;
|
||||
case Code.Ldc_R4: valueStack.push(new Real8Value((float)instr.Operand)); break;
|
||||
case Code.Ldc_R8: valueStack.push(new Real8Value((double)instr.Operand)); break;
|
||||
case Code.Ldc_I4_0: valueStack.push(new Int32Value(0)); break;
|
||||
case Code.Ldc_I4_1: valueStack.push(new Int32Value(1)); break;
|
||||
case Code.Ldc_I4_0: valueStack.push(Int32Value.zero); break;
|
||||
case Code.Ldc_I4_1: valueStack.push(Int32Value.one); break;
|
||||
case Code.Ldc_I4_2: valueStack.push(new Int32Value(2)); break;
|
||||
case Code.Ldc_I4_3: valueStack.push(new Int32Value(3)); break;
|
||||
case Code.Ldc_I4_4: valueStack.push(new Int32Value(4)); break;
|
||||
|
@ -775,7 +775,7 @@ namespace de4dot.blocks.cflow {
|
|||
else if (val1.isInt64() && val2.isInt64())
|
||||
valueStack.push(Int64Value.Ceq((Int64Value)val1, (Int64Value)val2));
|
||||
else if (val1.isNull() && val2.isNull())
|
||||
valueStack.push(new Int32Value(1));
|
||||
valueStack.push(Int32Value.one);
|
||||
else
|
||||
valueStack.push(Int32Value.createUnknownBool());
|
||||
}
|
||||
|
|
|
@ -21,6 +21,9 @@ using System;
|
|||
|
||||
namespace de4dot.blocks.cflow {
|
||||
public class Int32Value : Value {
|
||||
public static readonly Int32Value zero = new Int32Value(0);
|
||||
public static readonly Int32Value one = new Int32Value(1);
|
||||
|
||||
const uint NO_UNKNOWN_BITS = uint.MaxValue;
|
||||
public readonly int value;
|
||||
public readonly uint validMask;
|
||||
|
@ -223,7 +226,7 @@ namespace de4dot.blocks.cflow {
|
|||
if (a.allBitsValid() && b.allBitsValid())
|
||||
return new Int32Value(a.value - b.value);
|
||||
if (ReferenceEquals(a, b))
|
||||
return new Int32Value(0);
|
||||
return zero;
|
||||
return createUnknown();
|
||||
}
|
||||
|
||||
|
@ -231,7 +234,7 @@ namespace de4dot.blocks.cflow {
|
|||
if (a.allBitsValid() && b.allBitsValid())
|
||||
return new Int32Value(a.value * b.value);
|
||||
if (a.isZero() || b.isZero())
|
||||
return new Int32Value(0);
|
||||
return zero;
|
||||
if (a.hasValue(1))
|
||||
return b;
|
||||
if (b.hasValue(1))
|
||||
|
@ -249,7 +252,7 @@ namespace de4dot.blocks.cflow {
|
|||
}
|
||||
}
|
||||
if (ReferenceEquals(a, b) && a.isNonZero())
|
||||
return new Int32Value(1);
|
||||
return one;
|
||||
if (b.hasValue(1))
|
||||
return a;
|
||||
return createUnknown();
|
||||
|
@ -265,7 +268,7 @@ namespace de4dot.blocks.cflow {
|
|||
}
|
||||
}
|
||||
if (ReferenceEquals(a, b) && a.isNonZero())
|
||||
return new Int32Value(1);
|
||||
return one;
|
||||
if (b.hasValue(1))
|
||||
return a;
|
||||
return createUnknown();
|
||||
|
@ -281,7 +284,7 @@ namespace de4dot.blocks.cflow {
|
|||
}
|
||||
}
|
||||
if ((ReferenceEquals(a, b) && a.isNonZero()) || b.hasValue(1))
|
||||
return new Int32Value(0);
|
||||
return zero;
|
||||
return createUnknown();
|
||||
}
|
||||
|
||||
|
@ -295,7 +298,7 @@ namespace de4dot.blocks.cflow {
|
|||
}
|
||||
}
|
||||
if ((ReferenceEquals(a, b) && a.isNonZero()) || b.hasValue(1))
|
||||
return new Int32Value(0);
|
||||
return zero;
|
||||
return createUnknown();
|
||||
}
|
||||
|
||||
|
@ -319,7 +322,7 @@ namespace de4dot.blocks.cflow {
|
|||
|
||||
public static Int32Value Xor(Int32Value a, Int32Value b) {
|
||||
if (ReferenceEquals(a, b))
|
||||
return new Int32Value(0);
|
||||
return zero;
|
||||
int av = a.value, bv = b.value;
|
||||
uint am = a.validMask, bm = b.validMask;
|
||||
return new Int32Value(av ^ bv, (uint)(am & bm));
|
||||
|
@ -369,8 +372,8 @@ namespace de4dot.blocks.cflow {
|
|||
|
||||
static Int32Value create(Bool3 b) {
|
||||
switch (b) {
|
||||
case Bool3.False: return new Int32Value(0);
|
||||
case Bool3.True: return new Int32Value(1);
|
||||
case Bool3.False: return zero;
|
||||
case Bool3.True: return one;
|
||||
default: return createUnknownBool();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,9 @@ using System;
|
|||
|
||||
namespace de4dot.blocks.cflow {
|
||||
public class Int64Value : Value {
|
||||
public static readonly Int64Value zero = new Int64Value(0);
|
||||
public static readonly Int64Value one = new Int64Value(1);
|
||||
|
||||
const ulong NO_UNKNOWN_BITS = ulong.MaxValue;
|
||||
public readonly long value;
|
||||
public readonly ulong validMask;
|
||||
|
@ -117,7 +120,7 @@ namespace de4dot.blocks.cflow {
|
|||
if (a.allBitsValid() && b.allBitsValid())
|
||||
return new Int64Value(a.value - b.value);
|
||||
if (ReferenceEquals(a, b))
|
||||
return new Int64Value(0);
|
||||
return zero;
|
||||
return createUnknown();
|
||||
}
|
||||
|
||||
|
@ -125,7 +128,7 @@ namespace de4dot.blocks.cflow {
|
|||
if (a.allBitsValid() && b.allBitsValid())
|
||||
return new Int64Value(a.value * b.value);
|
||||
if (a.isZero() || b.isZero())
|
||||
return new Int64Value(0);
|
||||
return zero;
|
||||
if (a.hasValue(1))
|
||||
return b;
|
||||
if (b.hasValue(1))
|
||||
|
@ -143,7 +146,7 @@ namespace de4dot.blocks.cflow {
|
|||
}
|
||||
}
|
||||
if (ReferenceEquals(a, b) && a.isNonZero())
|
||||
return new Int64Value(1);
|
||||
return one;
|
||||
if (b.hasValue(1))
|
||||
return a;
|
||||
return createUnknown();
|
||||
|
@ -159,7 +162,7 @@ namespace de4dot.blocks.cflow {
|
|||
}
|
||||
}
|
||||
if (ReferenceEquals(a, b) && a.isNonZero())
|
||||
return new Int64Value(1);
|
||||
return one;
|
||||
if (b.hasValue(1))
|
||||
return a;
|
||||
return createUnknown();
|
||||
|
@ -175,7 +178,7 @@ namespace de4dot.blocks.cflow {
|
|||
}
|
||||
}
|
||||
if ((ReferenceEquals(a, b) && a.isNonZero()) || b.hasValue(1))
|
||||
return new Int64Value(0);
|
||||
return zero;
|
||||
return createUnknown();
|
||||
}
|
||||
|
||||
|
@ -189,7 +192,7 @@ namespace de4dot.blocks.cflow {
|
|||
}
|
||||
}
|
||||
if ((ReferenceEquals(a, b) && a.isNonZero()) || b.hasValue(1))
|
||||
return new Int64Value(0);
|
||||
return zero;
|
||||
return createUnknown();
|
||||
}
|
||||
|
||||
|
@ -213,7 +216,7 @@ namespace de4dot.blocks.cflow {
|
|||
|
||||
public static Int64Value Xor(Int64Value a, Int64Value b) {
|
||||
if (ReferenceEquals(a, b))
|
||||
return new Int64Value(0);
|
||||
return zero;
|
||||
long av = a.value, bv = b.value;
|
||||
ulong am = a.validMask, bm = b.validMask;
|
||||
return new Int64Value(av ^ bv, am & bm);
|
||||
|
@ -263,8 +266,8 @@ namespace de4dot.blocks.cflow {
|
|||
|
||||
static Int32Value create(Bool3 b) {
|
||||
switch (b) {
|
||||
case Bool3.False: return new Int32Value(0);
|
||||
case Bool3.True: return new Int32Value(1);
|
||||
case Bool3.False: return Int32Value.zero;
|
||||
case Bool3.True: return Int32Value.one;
|
||||
default: return Int32Value.createUnknownBool();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user