Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-2503 MOP 2.0 design inflluencing issues
  3. GROOVY-3478

Patch: Automatic type promotion for numbers

    XMLWordPrintableJSON

Details

    • Sub-task
    • Status: Open
    • Major
    • Resolution: Unresolved
    • None
    • 4.x
    • groovy-runtime
    • 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.

      Attachments

        Activity

          People

            Unassigned Unassigned
            olov Olov Lassus
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated: