示例#1
0
        /// <summary>
        /// 整数と小数の比較
        /// </summary>
        private DynamicMetaObject TryCalcOnDefferentNumericType(DynamicMetaObject left, DynamicMetaObject right)
        {
            Expression leftExpr  = BinderHelper.LimitTypeConvert(left);
            Expression rightExpr = BinderHelper.LimitTypeConvert(right);
            Expression expr      = null;

            foreach (var pattern in BinderHelper.CastPatterns)
            {
                if (leftExpr.Type == pattern.Narrow && rightExpr.Type == pattern.Wide)
                {
                    var upperLeft = Expression.Convert(leftExpr, pattern.Wide);
                    expr = Expression.MakeBinary(this.Operation, upperLeft, rightExpr);
                    break;
                }
                if (leftExpr.Type == pattern.Wide && rightExpr.Type == pattern.Narrow)
                {
                    var upperRight = Expression.Convert(rightExpr, pattern.Wide);
                    expr = Expression.MakeBinary(this.Operation, leftExpr, upperRight);
                    break;
                }
            }
            if (expr == null)
            {
                return(null);
            }
            return(new DynamicMetaObject(
                       BinderHelper.Wrap(expr, this.ReturnType),
                       BinderHelper.GetTypeRestriction(left, right)));
        }
示例#2
0
        /// <summary>
        /// 整数と小数の演算を行う
        /// </summary>
        private DynamicMetaObject TryCalcNumeric(DynamicMetaObject left, DynamicMetaObject right)
        {
            Expression leftExpr  = BinderHelper.LimitTypeConvert(left);
            Expression rightExpr = BinderHelper.LimitTypeConvert(right);
            Expression expr      = null;

            foreach (var pattern in BinderHelper.CastPatterns)
            {
                if (leftExpr.Type == pattern.Narrow && rightExpr.Type == pattern.Wide)
                {
                    var upperLeft = Expression.Convert(leftExpr, pattern.Wide);
                    expr = OverflowCheckingCalc(upperLeft, rightExpr);
                    break;
                }
                if (leftExpr.Type == pattern.Wide && rightExpr.Type == pattern.Narrow)
                {
                    var upperRight = Expression.Convert(rightExpr, pattern.Wide);
                    expr = OverflowCheckingCalc(leftExpr, upperRight);
                    break;
                }
            }
            if (expr == null)
            {
                return(null);
            }
            var bindings = BinderHelper.GetTypeRestriction(left, right);

            return(new DynamicMetaObject(expr, bindings));
        }