Real8Value can now also be "invalid", like Int{32|64}Value
This commit is contained in:
parent
156bc4c7ee
commit
52111f7e39
|
@ -141,7 +141,7 @@ namespace de4dot.blocks.cflow {
|
||||||
|
|
||||||
case ElementType.R4:
|
case ElementType.R4:
|
||||||
if (value.IsReal8())
|
if (value.IsReal8())
|
||||||
return new Real8Value((float)((Real8Value)value).Value);
|
return ((Real8Value)value).ToSingle();
|
||||||
return new UnknownValue();
|
return new UnknownValue();
|
||||||
|
|
||||||
case ElementType.R8:
|
case ElementType.R8:
|
||||||
|
@ -870,6 +870,8 @@ namespace de4dot.blocks.cflow {
|
||||||
valueStack.Push(Int32Value.Add_Ovf((Int32Value)val1, (Int32Value)val2));
|
valueStack.Push(Int32Value.Add_Ovf((Int32Value)val1, (Int32Value)val2));
|
||||||
else if (val1.IsInt64() && val2.IsInt64())
|
else if (val1.IsInt64() && val2.IsInt64())
|
||||||
valueStack.Push(Int64Value.Add_Ovf((Int64Value)val1, (Int64Value)val2));
|
valueStack.Push(Int64Value.Add_Ovf((Int64Value)val1, (Int64Value)val2));
|
||||||
|
else if (val1.IsReal8() && val2.IsReal8())
|
||||||
|
valueStack.Push(Real8Value.Add_Ovf((Real8Value)val1, (Real8Value)val2));
|
||||||
else
|
else
|
||||||
valueStack.PushUnknown();
|
valueStack.PushUnknown();
|
||||||
}
|
}
|
||||||
|
@ -882,6 +884,8 @@ namespace de4dot.blocks.cflow {
|
||||||
valueStack.Push(Int32Value.Add_Ovf_Un((Int32Value)val1, (Int32Value)val2));
|
valueStack.Push(Int32Value.Add_Ovf_Un((Int32Value)val1, (Int32Value)val2));
|
||||||
else if (val1.IsInt64() && val2.IsInt64())
|
else if (val1.IsInt64() && val2.IsInt64())
|
||||||
valueStack.Push(Int64Value.Add_Ovf_Un((Int64Value)val1, (Int64Value)val2));
|
valueStack.Push(Int64Value.Add_Ovf_Un((Int64Value)val1, (Int64Value)val2));
|
||||||
|
else if (val1.IsReal8() && val2.IsReal8())
|
||||||
|
valueStack.Push(Real8Value.Add_Ovf_Un((Real8Value)val1, (Real8Value)val2));
|
||||||
else
|
else
|
||||||
valueStack.PushUnknown();
|
valueStack.PushUnknown();
|
||||||
}
|
}
|
||||||
|
@ -894,6 +898,8 @@ namespace de4dot.blocks.cflow {
|
||||||
valueStack.Push(Int32Value.Sub_Ovf((Int32Value)val1, (Int32Value)val2));
|
valueStack.Push(Int32Value.Sub_Ovf((Int32Value)val1, (Int32Value)val2));
|
||||||
else if (val1.IsInt64() && val2.IsInt64())
|
else if (val1.IsInt64() && val2.IsInt64())
|
||||||
valueStack.Push(Int64Value.Sub_Ovf((Int64Value)val1, (Int64Value)val2));
|
valueStack.Push(Int64Value.Sub_Ovf((Int64Value)val1, (Int64Value)val2));
|
||||||
|
else if (val1.IsReal8() && val2.IsReal8())
|
||||||
|
valueStack.Push(Real8Value.Sub_Ovf((Real8Value)val1, (Real8Value)val2));
|
||||||
else
|
else
|
||||||
valueStack.PushUnknown();
|
valueStack.PushUnknown();
|
||||||
}
|
}
|
||||||
|
@ -906,6 +912,8 @@ namespace de4dot.blocks.cflow {
|
||||||
valueStack.Push(Int32Value.Sub_Ovf_Un((Int32Value)val1, (Int32Value)val2));
|
valueStack.Push(Int32Value.Sub_Ovf_Un((Int32Value)val1, (Int32Value)val2));
|
||||||
else if (val1.IsInt64() && val2.IsInt64())
|
else if (val1.IsInt64() && val2.IsInt64())
|
||||||
valueStack.Push(Int64Value.Sub_Ovf_Un((Int64Value)val1, (Int64Value)val2));
|
valueStack.Push(Int64Value.Sub_Ovf_Un((Int64Value)val1, (Int64Value)val2));
|
||||||
|
else if (val1.IsReal8() && val2.IsReal8())
|
||||||
|
valueStack.Push(Real8Value.Sub_Ovf_Un((Real8Value)val1, (Real8Value)val2));
|
||||||
else
|
else
|
||||||
valueStack.PushUnknown();
|
valueStack.PushUnknown();
|
||||||
}
|
}
|
||||||
|
@ -918,6 +926,8 @@ namespace de4dot.blocks.cflow {
|
||||||
valueStack.Push(Int32Value.Mul_Ovf((Int32Value)val1, (Int32Value)val2));
|
valueStack.Push(Int32Value.Mul_Ovf((Int32Value)val1, (Int32Value)val2));
|
||||||
else if (val1.IsInt64() && val2.IsInt64())
|
else if (val1.IsInt64() && val2.IsInt64())
|
||||||
valueStack.Push(Int64Value.Mul_Ovf((Int64Value)val1, (Int64Value)val2));
|
valueStack.Push(Int64Value.Mul_Ovf((Int64Value)val1, (Int64Value)val2));
|
||||||
|
else if (val1.IsReal8() && val2.IsReal8())
|
||||||
|
valueStack.Push(Real8Value.Mul_Ovf((Real8Value)val1, (Real8Value)val2));
|
||||||
else
|
else
|
||||||
valueStack.PushUnknown();
|
valueStack.PushUnknown();
|
||||||
}
|
}
|
||||||
|
@ -930,6 +940,8 @@ namespace de4dot.blocks.cflow {
|
||||||
valueStack.Push(Int32Value.Mul_Ovf_Un((Int32Value)val1, (Int32Value)val2));
|
valueStack.Push(Int32Value.Mul_Ovf_Un((Int32Value)val1, (Int32Value)val2));
|
||||||
else if (val1.IsInt64() && val2.IsInt64())
|
else if (val1.IsInt64() && val2.IsInt64())
|
||||||
valueStack.Push(Int64Value.Mul_Ovf_Un((Int64Value)val1, (Int64Value)val2));
|
valueStack.Push(Int64Value.Mul_Ovf_Un((Int64Value)val1, (Int64Value)val2));
|
||||||
|
else if (val1.IsReal8() && val2.IsReal8())
|
||||||
|
valueStack.Push(Real8Value.Mul_Ovf_Un((Real8Value)val1, (Real8Value)val2));
|
||||||
else
|
else
|
||||||
valueStack.PushUnknown();
|
valueStack.PushUnknown();
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,6 +131,8 @@ namespace de4dot.blocks.cflow {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Int32Value Conv_U1(Real8Value a) {
|
public static Int32Value Conv_U1(Real8Value a) {
|
||||||
|
if (!a.IsValid)
|
||||||
|
return CreateUnknownUInt8();
|
||||||
return new Int32Value((int)(byte)a.Value);
|
return new Int32Value((int)(byte)a.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,6 +154,8 @@ namespace de4dot.blocks.cflow {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Int32Value Conv_I1(Real8Value a) {
|
public static Int32Value Conv_I1(Real8Value a) {
|
||||||
|
if (!a.IsValid)
|
||||||
|
return CreateUnknown();
|
||||||
return new Int32Value((int)(sbyte)a.Value);
|
return new Int32Value((int)(sbyte)a.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,6 +174,8 @@ namespace de4dot.blocks.cflow {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Int32Value Conv_U2(Real8Value a) {
|
public static Int32Value Conv_U2(Real8Value a) {
|
||||||
|
if (!a.IsValid)
|
||||||
|
return CreateUnknownUInt16();
|
||||||
return new Int32Value((int)(ushort)a.Value);
|
return new Int32Value((int)(ushort)a.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,6 +197,8 @@ namespace de4dot.blocks.cflow {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Int32Value Conv_I2(Real8Value a) {
|
public static Int32Value Conv_I2(Real8Value a) {
|
||||||
|
if (!a.IsValid)
|
||||||
|
return CreateUnknown();
|
||||||
return new Int32Value((int)(short)a.Value);
|
return new Int32Value((int)(short)a.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,6 +211,8 @@ namespace de4dot.blocks.cflow {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Int32Value Conv_U4(Real8Value a) {
|
public static Int32Value Conv_U4(Real8Value a) {
|
||||||
|
if (!a.IsValid)
|
||||||
|
return CreateUnknown();
|
||||||
return new Int32Value((int)(uint)a.Value);
|
return new Int32Value((int)(uint)a.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,6 +225,8 @@ namespace de4dot.blocks.cflow {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Int32Value Conv_I4(Real8Value a) {
|
public static Int32Value Conv_I4(Real8Value a) {
|
||||||
|
if (!a.IsValid)
|
||||||
|
return CreateUnknown();
|
||||||
return new Int32Value((int)a.Value);
|
return new Int32Value((int)a.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,8 @@ namespace de4dot.blocks.cflow {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Int64Value Conv_U8(Real8Value a) {
|
public static Int64Value Conv_U8(Real8Value a) {
|
||||||
|
if (!a.IsValid)
|
||||||
|
return CreateUnknown();
|
||||||
return new Int64Value((long)(ulong)a.Value);
|
return new Int64Value((long)(ulong)a.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,6 +111,8 @@ namespace de4dot.blocks.cflow {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Int64Value Conv_I8(Real8Value a) {
|
public static Int64Value Conv_I8(Real8Value a) {
|
||||||
|
if (!a.IsValid)
|
||||||
|
return CreateUnknown();
|
||||||
return new Int64Value((long)a.Value);
|
return new Int64Value((long)a.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,36 +20,90 @@
|
||||||
namespace de4dot.blocks.cflow {
|
namespace de4dot.blocks.cflow {
|
||||||
public class Real8Value : Value {
|
public class Real8Value : Value {
|
||||||
public readonly double Value;
|
public readonly double Value;
|
||||||
|
public readonly bool IsValid;
|
||||||
|
|
||||||
public Real8Value(double value)
|
public Real8Value(double value)
|
||||||
: base(ValueType.Real8) {
|
: base(ValueType.Real8) {
|
||||||
this.Value = value;
|
this.Value = value;
|
||||||
|
this.IsValid = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Real8Value(double value, bool isValid)
|
||||||
|
: base(ValueType.Real8) {
|
||||||
|
this.Value = value;
|
||||||
|
this.IsValid = isValid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Real8Value CreateUnknown() {
|
||||||
|
return new Real8Value(0, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Real8Value ToSingle() {
|
||||||
|
if (!IsValid)
|
||||||
|
return CreateUnknown();
|
||||||
|
return new Real8Value((float)Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Real8Value Add(Real8Value a, Real8Value b) {
|
public static Real8Value Add(Real8Value a, Real8Value b) {
|
||||||
|
if (!a.IsValid || !b.IsValid)
|
||||||
|
return CreateUnknown();
|
||||||
return new Real8Value(a.Value + b.Value);
|
return new Real8Value(a.Value + b.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Real8Value Sub(Real8Value a, Real8Value b) {
|
public static Real8Value Sub(Real8Value a, Real8Value b) {
|
||||||
|
if (!a.IsValid || !b.IsValid)
|
||||||
|
return CreateUnknown();
|
||||||
return new Real8Value(a.Value - b.Value);
|
return new Real8Value(a.Value - b.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Real8Value Mul(Real8Value a, Real8Value b) {
|
public static Real8Value Mul(Real8Value a, Real8Value b) {
|
||||||
|
if (!a.IsValid || !b.IsValid)
|
||||||
|
return CreateUnknown();
|
||||||
return new Real8Value(a.Value * b.Value);
|
return new Real8Value(a.Value * b.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Real8Value Div(Real8Value a, Real8Value b) {
|
public static Real8Value Div(Real8Value a, Real8Value b) {
|
||||||
|
if (!a.IsValid || !b.IsValid)
|
||||||
|
return CreateUnknown();
|
||||||
return new Real8Value(a.Value / b.Value);
|
return new Real8Value(a.Value / b.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Real8Value Rem(Real8Value a, Real8Value b) {
|
public static Real8Value Rem(Real8Value a, Real8Value b) {
|
||||||
|
if (!a.IsValid || !b.IsValid)
|
||||||
|
return CreateUnknown();
|
||||||
return new Real8Value(a.Value % b.Value);
|
return new Real8Value(a.Value % b.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Real8Value Neg(Real8Value a) {
|
public static Real8Value Neg(Real8Value a) {
|
||||||
|
if (!a.IsValid)
|
||||||
|
return CreateUnknown();
|
||||||
return new Real8Value(-a.Value);
|
return new Real8Value(-a.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Real8Value Add_Ovf(Real8Value a, Real8Value b) {
|
||||||
|
return CreateUnknown();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Real8Value Add_Ovf_Un(Real8Value a, Real8Value b) {
|
||||||
|
return CreateUnknown();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Real8Value Sub_Ovf(Real8Value a, Real8Value b) {
|
||||||
|
return CreateUnknown();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Real8Value Sub_Ovf_Un(Real8Value a, Real8Value b) {
|
||||||
|
return CreateUnknown();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Real8Value Mul_Ovf(Real8Value a, Real8Value b) {
|
||||||
|
return CreateUnknown();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Real8Value Mul_Ovf_Un(Real8Value a, Real8Value b) {
|
||||||
|
return CreateUnknown();
|
||||||
|
}
|
||||||
|
|
||||||
public static Int32Value Conv_Ovf_I1(Real8Value a) {
|
public static Int32Value Conv_Ovf_I1(Real8Value a) {
|
||||||
return Int32Value.CreateUnknown();
|
return Int32Value.CreateUnknown();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user