More info in mail thread http://www.nabble.com/Patch:-Dynamic-type-promotion-td22976282.html
Patch attached. Diffstat:
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.