You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by he...@apache.org on 2009/09/14 15:28:21 UTC
svn commit: r814634 -
/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlArithmetic.java
Author: henrib
Date: Mon Sep 14 13:28:20 2009
New Revision: 814634
URL: http://svn.apache.org/viewvc?rev=814634&view=rev
Log:
When arithmetic operations are performed on 'natural' types, do not narrow to Long if either argument is BigInteger and do not narrow to Integer if either argument is a Long; updated JavaDoc accordingly
Modified:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlArithmetic.java
Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlArithmetic.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlArithmetic.java?rev=814634&r1=814633&r2=814634&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlArithmetic.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlArithmetic.java Mon Sep 14 13:28:20 2009
@@ -28,10 +28,13 @@
* <li>If either is a floating point number, coerce both to Double and perform operation</li>
* <li>If both are BigInteger, treat as BigInteger and perform operation</li>
* <li>If either is a BigDecimal, coerce both to BigDecimal and and perform operation</li>
- * <li>Else treat as BigInteger and and perform operation</li>
+ * <li>Else treat as BigInteger, perform operation and attempt to narrow result:
+ * <ol>
+ * <li>if both arguments can be narrowed to Integer, narrow result to Integer</li>
+ * <li>if both arguments can be narrowed to Long, narrow result to Long</li>
+ * <li>Else return result as BigInteger</li>
+ * </ol>
* </ol>
- * If the result of the operation is an integer, it will be narrowed to integer or long if
- * possible.
* </p>
* @since 2.0
*/
@@ -147,18 +150,30 @@
}
/**
- * Given a BigInteger, narrow it to an Integer or Long if it fits.
+ * Given a BigInteger, narrow it to an Integer or Long if it fits and the arguments
+ * class allow it.
+ * <p>
+ * The rules are:
+ * if either arguments is a BigInteger, no narrowing will occur
+ * if either arguments is a Long, no narrowing to Integer will occur
+ * </p>
+ * @param lhs the left hand side operand that lead to the bigi result
+ * @param rhs the right hand side operand that lead to the bigi result
* @param bigi the BigInteger to narrow
+ * @param narrowInt whether we should try narrowing to int (@see mayNarrowToInt)
* @return an Integer or Long if narrowing is possible, the original BigInteger otherwise
*/
- protected Number narrowBigInteger(BigInteger bigi) {
+ protected Number narrowBigInteger(Object lhs, Object rhs, BigInteger bigi) {
//coerce to long if possible
- if (bigi.compareTo(BIGI_LONG_MAX_VALUE) <= 0
+ if (!(lhs instanceof BigInteger || rhs instanceof BigInteger)
+ && bigi.compareTo(BIGI_LONG_MAX_VALUE) <= 0
&& bigi.compareTo(BIGI_LONG_MIN_VALUE) >= 0) {
// coerce to int if possible
long l = bigi.longValue();
// coerce to int when possible (int being so often used in method parms)
- if (l <= Integer.MAX_VALUE && l >= Integer.MIN_VALUE) {
+ if (!(lhs instanceof Long || rhs instanceof Long)
+ && l <= Integer.MAX_VALUE
+ && l >= Integer.MIN_VALUE) {
return new Integer((int) l);
}
return new Long(l);
@@ -207,7 +222,7 @@
BigInteger l = toBigInteger(left);
BigInteger r = toBigInteger(right);
BigInteger result = l.add(r);
- return narrowBigInteger(result);
+ return narrowBigInteger(left, right, result);
} catch (java.lang.NumberFormatException nfe) {
// Well, use strings!
return toString(left).concat(toString(right));
@@ -255,7 +270,7 @@
BigInteger l = toBigInteger(left);
BigInteger r = toBigInteger(right);
BigInteger result = l.divide(r);
- return narrowBigInteger(result);
+ return narrowBigInteger(left, right, result);
}
/**
@@ -299,7 +314,7 @@
BigInteger l = toBigInteger(left);
BigInteger r = toBigInteger(right);
BigInteger result = l.mod(r);
- return narrowBigInteger(result);
+ return narrowBigInteger(left, right, result);
}
/**
@@ -338,7 +353,7 @@
BigInteger l = toBigInteger(left);
BigInteger r = toBigInteger(right);
BigInteger result = l.multiply(r);
- return narrowBigInteger(result);
+ return narrowBigInteger(left, right, result);
}
/**
@@ -377,7 +392,7 @@
BigInteger l = toBigInteger(left);
BigInteger r = toBigInteger(right);
BigInteger result = l.subtract(r);
- return narrowBigInteger(result);
+ return narrowBigInteger(left, right, result);
}
/**