Speed up getUnknownValue() method. 16-17% execution time -> ~6%

This commit is contained in:
de4dot 2012-01-26 22:22:24 +01:00
parent 6505a2490a
commit ec45974605

View File

@ -21,6 +21,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using Mono.Cecil; using Mono.Cecil;
using Mono.Cecil.Cil; using Mono.Cecil.Cil;
using Mono.Cecil.Metadata;
namespace de4dot.blocks.cflow { namespace de4dot.blocks.cflow {
public class InstructionEmulator { public class InstructionEmulator {
@ -69,42 +70,38 @@ namespace de4dot.blocks.cflow {
return new UnknownValue(); return new UnknownValue();
if (!typeReference.IsValueType) if (!typeReference.IsValueType)
return NullValue.Instance; return NullValue.Instance;
else if (DotNetUtils.isAssembly(typeReference.Scope, "mscorlib")) { switch (typeReference.EType) {
switch (typeReference.FullName) { case ElementType.Boolean:
case "System.Boolean": case ElementType.I1:
case "System.SByte": case ElementType.U1:
case "System.Byte": case ElementType.I2:
case "System.Int16": case ElementType.U2:
case "System.UInt16": case ElementType.I4:
case "System.Int32": case ElementType.U4:
case "System.UInt32":
return new Int32Value(0); return new Int32Value(0);
case "System.Int64": case ElementType.I8:
case "System.UInt64": case ElementType.U8:
return new Int64Value(0); return new Int64Value(0);
case "System.Single": case ElementType.R4:
case "System.Double": case ElementType.R8:
return new Real8Value(0); return new Real8Value(0);
} }
}
return new UnknownValue(); return new UnknownValue();
} }
static Value getUnknownValue(TypeReference typeReference) { static Value getUnknownValue(TypeReference typeReference) {
if (typeReference == null) if (typeReference == null)
return new UnknownValue(); return new UnknownValue();
if (DotNetUtils.isAssembly(typeReference.Scope, "mscorlib")) { switch (typeReference.EType) {
switch (typeReference.FullName) { case ElementType.Boolean: return Int32Value.createUnknownBool();
case "System.Boolean": return Int32Value.createUnknownBool(); case ElementType.I1: return Int32Value.createUnknown();
case "System.SByte": return Int32Value.createUnknown(); case ElementType.U1: return Int32Value.createUnknownUInt8();
case "System.Byte": return Int32Value.createUnknownUInt8(); case ElementType.I2: return Int32Value.createUnknown();
case "System.Int16": return Int32Value.createUnknown(); case ElementType.U2: return Int32Value.createUnknownUInt16();
case "System.UInt16": return Int32Value.createUnknownUInt16(); case ElementType.I4: return Int32Value.createUnknown();
case "System.Int32": return Int32Value.createUnknown(); case ElementType.U4: return Int32Value.createUnknown();
case "System.UInt32": return Int32Value.createUnknown(); case ElementType.I8: return Int64Value.createUnknown();
case "System.Int64": return Int64Value.createUnknown(); case ElementType.U8: return Int64Value.createUnknown();
case "System.UInt64": return Int64Value.createUnknown();
}
} }
return new UnknownValue(); return new UnknownValue();
} }
@ -112,46 +109,45 @@ namespace de4dot.blocks.cflow {
static Value truncateValue(Value value, TypeReference typeReference) { static Value truncateValue(Value value, TypeReference typeReference) {
if (typeReference == null) if (typeReference == null)
return value; return value;
if (DotNetUtils.isAssembly(typeReference.Scope, "mscorlib")) {
switch (typeReference.FullName) { switch (typeReference.EType) {
case "System.Boolean": case ElementType.Boolean:
if (value.isInt32()) if (value.isInt32())
return ((Int32Value)value).toBoolean(); return ((Int32Value)value).toBoolean();
return Int32Value.createUnknownBool(); return Int32Value.createUnknownBool();
case "System.SByte": case ElementType.I1:
if (value.isInt32()) if (value.isInt32())
return ((Int32Value)value).toInt8(); return ((Int32Value)value).toInt8();
return Int32Value.createUnknown(); return Int32Value.createUnknown();
case "System.Byte": case ElementType.U1:
if (value.isInt32()) if (value.isInt32())
return ((Int32Value)value).toUInt8(); return ((Int32Value)value).toUInt8();
return Int32Value.createUnknownUInt8(); return Int32Value.createUnknownUInt8();
case "System.Int16": case ElementType.I2:
if (value.isInt32()) if (value.isInt32())
return ((Int32Value)value).toInt16(); return ((Int32Value)value).toInt16();
return Int32Value.createUnknown(); return Int32Value.createUnknown();
case "System.UInt16": case ElementType.U2:
if (value.isInt32()) if (value.isInt32())
return ((Int32Value)value).toUInt16(); return ((Int32Value)value).toUInt16();
return Int32Value.createUnknownUInt16(); return Int32Value.createUnknownUInt16();
case "System.Int32": case ElementType.I4:
case "System.UInt32": case ElementType.U4:
if (value.isInt32()) if (value.isInt32())
return value; return value;
return Int32Value.createUnknown(); return Int32Value.createUnknown();
case "System.Int64": case ElementType.I8:
case "System.UInt64": case ElementType.U8:
if (value.isInt64()) if (value.isInt64())
return value; return value;
return Int64Value.createUnknown(); return Int64Value.createUnknown();
} }
}
return value; return value;
} }