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

Attach filesAttach ScreenshotAdd voteVotersWatch issueWatchersLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    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

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            Unassigned Unassigned
            olov Olov Lassus

            Dates

              Created:
              Updated:

              Slack

                Issue deployment