Create instances of common constants

This commit is contained in:
de4dot 2012-01-26 23:57:37 +01:00
parent 91559b95e4
commit 91cc161a9d
3 changed files with 29 additions and 23 deletions

View File

@ -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());
}

View File

@ -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();
}
}

View File

@ -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();
}
}