/// <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))); }
/// <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)); }