You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2021/11/29 19:14:49 UTC

[groovy] branch master updated: GROOVY-10395: SC: `a <=> b` into `Integer.compare(a, b)` for primitives

This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new cc8076d  GROOVY-10395: SC: `a <=> b` into `Integer.compare(a,b)` for primitives
cc8076d is described below

commit cc8076da18d0470565a61c122ff3a995dd257a5c
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Nov 29 12:55:33 2021 -0600

    GROOVY-10395: SC: `a <=> b` into `Integer.compare(a,b)` for primitives
---
 .../sc/transformers/BinaryExpressionTransformer.java   | 18 ++++++++++++++++++
 .../asm/sc/NaryExpressionTestStaticCompileTest.groovy  | 17 +++++++++++++++--
 2 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/sc/transformers/BinaryExpressionTransformer.java b/src/main/java/org/codehaus/groovy/transform/sc/transformers/BinaryExpressionTransformer.java
index 9d41612..cd7911c 100644
--- a/src/main/java/org/codehaus/groovy/transform/sc/transformers/BinaryExpressionTransformer.java
+++ b/src/main/java/org/codehaus/groovy/transform/sc/transformers/BinaryExpressionTransformer.java
@@ -287,6 +287,24 @@ public class BinaryExpressionTransformer {
         Expression leftExpression = bin.getLeftExpression(), rightExpression = bin.getRightExpression();
         ClassNode leftType = findType(leftExpression), rightType = findType(rightExpression);
 
+        // same-type primitive compare
+        if (leftType.equals(rightType)
+                && ClassHelper.isPrimitiveType(leftType)
+                || ClassHelper.isPrimitiveType(rightType)) {
+            ClassNode wrapperType = ClassHelper.getWrapper(leftType);
+            Expression leftAndRight = args(
+                staticCompilationTransformer.transform(leftExpression),
+                staticCompilationTransformer.transform(rightExpression)
+            );
+            // transform "a <=> b" into "[Integer|Long|Short|Byte|Double|Float|...].compare(a,b)"
+            MethodCallExpression call = callX(classX(wrapperType), "compare", leftAndRight);
+            call.putNodeMetaData(StaticTypesMarker.INFERRED_TYPE, ClassHelper.int_TYPE);
+            call.setMethodTarget(wrapperType.getMethods("compare").get(0));
+            call.setImplicitThis(false);
+            call.setSourcePosition(bin);
+            return call;
+        }
+
         if (leftType.implementsInterface(ClassHelper.COMPARABLE_TYPE)
                 && rightType.implementsInterface(ClassHelper.COMPARABLE_TYPE)) {
             // GROOVY-5644, GROOVY-6137, GROOVY-7473, GROOVY-10394: null safety and one-time evaluation
diff --git a/src/test/org/codehaus/groovy/classgen/asm/sc/NaryExpressionTestStaticCompileTest.groovy b/src/test/org/codehaus/groovy/classgen/asm/sc/NaryExpressionTestStaticCompileTest.groovy
index aa11e8c..50004d4 100644
--- a/src/test/org/codehaus/groovy/classgen/asm/sc/NaryExpressionTestStaticCompileTest.groovy
+++ b/src/test/org/codehaus/groovy/classgen/asm/sc/NaryExpressionTestStaticCompileTest.groovy
@@ -21,9 +21,22 @@ package org.codehaus.groovy.classgen.asm.sc
 import groovy.transform.stc.STCnAryExpressionTest
 
 /**
- * Unit tests for static type checking : n-ary ops.
+ * Unit tests for static type checking : n-ary operators
  */
 class NaryExpressionTestStaticCompileTest extends STCnAryExpressionTest implements StaticCompilationTestSupport {
 
+    // GROOVY-10395
+    void testUfoOperatorShouldRedirectForPrimitives() {
+        assertScript '''
+            int test(boolean a, boolean b) {
+                a <=> b
+            }
+            assert test(false,false) == 0
+            assert test(false,true) < 0
+            assert test(true,false) > 0
+            assert test(true,true) == 0
+        '''
+        String out = astTrees.values()[0][1]
+        assert out.contains('INVOKESTATIC java/lang/Boolean.compare')
+    }
 }
-