This is an automated email from the ASF dual-hosted git repository. sunlan pushed a commit to branch GROOVY_4_0_X in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push: new 4cf5196cac GROOVY-11415: Tweak bytecode for identity 4cf5196cac is described below commit 4cf5196cace32ecb837d2f3b4885be1cc176f7a3 Author: Daniel Sun <sun...@apache.org> AuthorDate: Mon Jul 1 15:51:21 2024 +0000 GROOVY-11415: Tweak bytecode for identity (cherry picked from commit 5ec593d588badb99daa48dde9f9242ea6291f1ba) --- .../classgen/asm/BinaryExpressionHelper.java | 7 +++++-- .../classgen/asm/StatementMetaTypeChooser.java | 3 ++- src/test-resources/core/IdenticalOp_01x.groovy | 24 ++++++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java b/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java index 8434c3975a..724a060498 100644 --- a/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java +++ b/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java @@ -345,14 +345,17 @@ public class BinaryExpressionHelper { AsmClassGenerator acg = controller.getAcg(); MethodVisitor mv = controller.getMethodVisitor(); OperandStack operandStack = controller.getOperandStack(); + TypeChooser typeChooser = controller.getTypeChooser(); Expression lhs = expression.getLeftExpression(); lhs.visit(acg); - if (ClassHelper.isPrimitiveType(lhs.getType())) operandStack.box(); + ClassNode leftType = typeChooser.resolveType(lhs, controller.getClassNode()); + if (ClassHelper.isPrimitiveType(leftType)) operandStack.box(); Expression rhs = expression.getRightExpression(); rhs.visit(acg); - if (ClassHelper.isPrimitiveType(rhs.getType())) operandStack.box(); + ClassNode rightType = typeChooser.resolveType(rhs, controller.getClassNode()); + if (ClassHelper.isPrimitiveType(rightType)) operandStack.box(); Label trueCase = operandStack.jump(identical ? IF_ACMPEQ : IF_ACMPNE); ConstantExpression.PRIM_FALSE.visit(acg); diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/StatementMetaTypeChooser.java b/src/main/java/org/codehaus/groovy/classgen/asm/StatementMetaTypeChooser.java index 99611b5c2b..6cf35b31b9 100644 --- a/src/main/java/org/codehaus/groovy/classgen/asm/StatementMetaTypeChooser.java +++ b/src/main/java/org/codehaus/groovy/classgen/asm/StatementMetaTypeChooser.java @@ -33,7 +33,8 @@ public class StatementMetaTypeChooser implements TypeChooser { @Override public ClassNode resolveType(final Expression exp, final ClassNode current) { ClassNode type = null; - if (exp instanceof ClassExpression) { type = exp.getType(); + if (exp instanceof ClassExpression) { + type = exp.getType(); ClassNode classType = ClassHelper.makeWithoutCaching("java.lang.Class"); classType.setGenericsTypes(new GenericsType[] {new GenericsType(type)}); classType.setRedirect(ClassHelper.CLASS_Type); diff --git a/src/test-resources/core/IdenticalOp_01x.groovy b/src/test-resources/core/IdenticalOp_01x.groovy index 9efe74daca..d4998d4e27 100644 --- a/src/test-resources/core/IdenticalOp_01x.groovy +++ b/src/test-resources/core/IdenticalOp_01x.groovy @@ -40,6 +40,18 @@ def c() { assert 0 === 0 assert 0 !== null assert null !== 0 + + int e = 1 + int f = 1 + assert e === f + + int g = 1 + Integer h = 1 + assert g === h + + Integer j = 1 + int k = 1 + assert j === k } c() @@ -65,5 +77,17 @@ def c_cs() { assert 0 === 0 assert 0 !== null assert null !== 0 + + int e = 1 + int f = 1 + assert e === f + + int g = 1 + Integer h = 1 + assert g === h + + Integer j = 1 + int k = 1 + assert j === k } c_cs()