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')
+ }
}
-