Details
-
Sub-task
-
Status: Open
-
Major
-
Resolution: Unresolved
-
None
-
None
-
N/A
-
Patch
Description
groovy:000> 1000 * 1000000000 ===> 1000000000000
More info in mail thread http://www.nabble.com/Patch:-Dynamic-type-promotion-td22976282.html
Patch attached. Diffstat:
main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java | 23 - main/org/codehaus/groovy/runtime/InvokerHelper.java | 20 - main/org/codehaus/groovy/runtime/typehandling/BigIntegerMath.java | 26 + main/org/codehaus/groovy/runtime/typehandling/IntegerMath.java | 70 ++++ main/org/codehaus/groovy/runtime/typehandling/LongMath.java | 85 ++++-- main/org/codehaus/groovy/runtime/typehandling/NumberMath.java | 90 ++++-- test/groovy/operator/IntegerOperatorsTest.groovy | 141 +++++++++- 7 files changed, 369 insertions(+), 86 deletions(-)
I'll also keep an updated patch available at http://dl.getdropbox.com/u/283098/patches/groovy_dynamic_type_promotion.patch
Here's an overview of the patch:
- Added test cases to IntegerOperatorsTest.groovy
- Modified NumberMath toBigInteger and toBigDecimal methods to call into DefaultGroovyMethods versions
- Modified IntegerMath to support dynamic type promotion for abs, add, subtract, multiply, unary minus and left shift.
- Modified BigIntegerMath to support left shift and right shift. It does not support unsigned right shift (>>>).
- Modified LongMath to support dynamic type promotion for abs, add, subtract, multiply, unary minus and left shift. Also changed a few "new Long" to "Long.valueOf" since it can be faster.
- Modified DefaultGroovyMethods.abs to call into NumberMath. Optimized toBigInteger so that it doesn't do unnecessary string conversions. Tweaked a few comments.
- Modified InvokerHelper.unaryMinus. Tweaked some valueOf.
- Modified semantics for the shift operators. It's now type coerced/promoted the same as other binary operators. Negative shifts are not allowed.