static FieldDefinition GetFieldDefinition(FieldReference field)
 {
     return(CecilExtensions.ResolveWithinSameModule(field));
 }
 static MethodDefinition GetMethodDefinition(MethodReference method)
 {
     return(CecilExtensions.ResolveWithinSameModule(method));
 }
示例#3
0
        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());
            }
        }