Speed up getUnknownValue() method. 16-17% execution time -> ~6%
This commit is contained in:
parent
6505a2490a
commit
ec45974605
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user