static FieldDefinition GetFieldDefinition(FieldReference field) { return(CecilExtensions.ResolveWithinSameModule(field)); }
static MethodDefinition GetMethodDefinition(MethodReference method) { return(CecilExtensions.ResolveWithinSameModule(method)); }
public SymbolicValue Eval(ILExpression expr) { SymbolicValue left, right; switch (expr.Code) { case ILCode.Sub: left = Eval(expr.Arguments[0]); right = Eval(expr.Arguments[1]); if (left.Type != SymbolicValueType.State && left.Type != SymbolicValueType.IntegerConstant) { return(Failed()); } if (right.Type != SymbolicValueType.IntegerConstant) { return(Failed()); } return(new SymbolicValue(left.Type, unchecked (left.Constant - right.Constant))); case ILCode.Ldfld: if (Eval(expr.Arguments[0]).Type != SymbolicValueType.This) { return(Failed()); } if (CecilExtensions.ResolveWithinSameModule(expr.Operand as FieldReference) != stateField) { return(Failed()); } return(new SymbolicValue(SymbolicValueType.State)); case ILCode.Ldloc: ILVariable loadedVariable = (ILVariable)expr.Operand; if (stateVariables.Contains(loadedVariable)) { return(new SymbolicValue(SymbolicValueType.State)); } else if (loadedVariable.IsParameter && loadedVariable.OriginalParameter.Index < 0) { return(new SymbolicValue(SymbolicValueType.This)); } else { return(Failed()); } case ILCode.Ldc_I4: return(new SymbolicValue(SymbolicValueType.IntegerConstant, (int)expr.Operand)); case ILCode.Ceq: case ILCode.Cne: left = Eval(expr.Arguments[0]); right = Eval(expr.Arguments[1]); if (left.Type != SymbolicValueType.State || right.Type != SymbolicValueType.IntegerConstant) { return(Failed()); } // bool: (state + left.Constant == right.Constant) // bool: (state == right.Constant - left.Constant) return(new SymbolicValue(expr.Code == ILCode.Ceq ? SymbolicValueType.StateEquals : SymbolicValueType.StateInEquals, unchecked (right.Constant - left.Constant))); case ILCode.LogicNot: SymbolicValue val = Eval(expr.Arguments[0]); if (val.Type == SymbolicValueType.StateEquals) { return(new SymbolicValue(SymbolicValueType.StateInEquals, val.Constant)); } else if (val.Type == SymbolicValueType.StateInEquals) { return(new SymbolicValue(SymbolicValueType.StateEquals, val.Constant)); } else { return(Failed()); } default: return(Failed()); } }