public override TDomain Assert(APC pc, EdgeTag tag, TVar condition, TDomain data) { var boxed = ToBoxedExpression(pc, condition); bool result; if (boxed.IsTrivialCondition(out result)) { return(result ? data : data.Bottom); } data = data.AssumeTrue(boxed); var type = ContextProvider.ValueContext.GetType( ContextProvider.MethodContext.CFG.Post(pc), condition); if (type.IsNormal() && MetaDataProvider.Equal(type.Value, MetaDataProvider.System_Boolean)) { var guard = BoxedExpression.Binary(BinaryOperator.Ceq, boxed, BoxedExpression.Const(1, MetaDataProvider. System_Int32)); data = data.AssumeTrue(guard); } return(data); }
public ExpressionType TypeOf(TExpr expr) { if (IsConstant(expr)) { return(ExpressionContext.Decode <Dummy, ExpressionType, VisitorForTypeOf> (expr, type_of, Dummy.Value)); } var abstractType = ExpressionContext.GetType(expr); if (abstractType.IsNormal()) { var type = abstractType.Value; if (MetaDataProvider.IsPrimitive(type)) { if (MetaDataProvider.Equal(type, MetaDataProvider.System_Int32)) { return(ExpressionType.Int32); } if (MetaDataProvider.Equal(type, MetaDataProvider.System_Single)) { return(ExpressionType.Float32); } if (MetaDataProvider.Equal(type, MetaDataProvider.System_Double)) { return(ExpressionType.Float64); } if (MetaDataProvider.Equal(type, MetaDataProvider.System_Boolean)) { return(ExpressionType.Bool); } } } return(ExpressionType.Unknown); }
public override TDomain Assume(APC pc, EdgeTag tag, TVar condition, TDomain data) { var boxed = ToBoxedExpression(pc, condition); if (tag != EdgeTag.False) { bool value; if (boxed.IsTrivialCondition(out value)) { return(!value ? data.Bottom : data); } } List <int> thresholds; if (ThresholdDB.TryGetAThreshold(boxed, expression_decoder, out thresholds)) { ThresholdDB.Add(thresholds); } TDomain result; switch (tag) { case EdgeTag.True: case EdgeTag.Requires: case EdgeTag.Assume: case EdgeTag.Invariant: result = data.AssumeTrue(boxed); break; case EdgeTag.False: result = data.AssumeFalse(boxed); break; default: result = data; break; } if (tag != EdgeTag.False) { var abstractType = ContextProvider.ValueContext.GetType( ContextProvider.MethodContext.CFG.Post(pc), condition); if (abstractType.IsNormal() && MetaDataProvider.Equal(abstractType.Value, MetaDataProvider.System_Boolean)) { var guard = BoxedExpression.Binary(BinaryOperator.Ceq, boxed, BoxedExpression.Const(1, MetaDataProvider . System_Int32)); result = result.AssumeTrue(guard); } } return(result); }