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 2025/09/02 14:06:49 UTC
(groovy) branch GROOVY_5_0_X updated: GROOVY-11747: put back left type to choose from `POP`/`POP2` properly
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY_5_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_5_0_X by this push:
new 76d306c74e GROOVY-11747: put back left type to choose from `POP`/`POP2` properly
76d306c74e is described below
commit 76d306c74e04a70ddc941c449e968a3360b8d89c
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Sep 2 08:34:05 2025 -0500
GROOVY-11747: put back left type to choose from `POP`/`POP2` properly
---
.../groovy/classgen/asm/BinaryExpressionHelper.java | 2 ++
.../groovy/operator/TernaryOperatorsTest.groovy | 21 ++++++++++++++++-----
2 files changed, 18 insertions(+), 5 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 274a6a9bcd..dfca7097a4 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
@@ -984,6 +984,7 @@ public class BinaryExpressionHelper {
// load x, dup it and cast to boolean
truePart.visit(controller.getAcg());
int top = operandStack.getStackLength();
+ var type = operandStack.getTopOperand();
operandStack.dup();
operandStack.castToBool(top, true);
Label l0 = operandStack.jump(IFEQ);
@@ -995,6 +996,7 @@ public class BinaryExpressionHelper {
// false path: drop x, load y and cast to T
mv.visitLabel(l0);
+ operandStack.replace(type); // GROOVY-11747
operandStack.pop();
falsePart.visit(controller.getAcg());
operandStack.doGroovyCast(commonType);
diff --git a/src/test/groovy/groovy/operator/TernaryOperatorsTest.groovy b/src/test/groovy/groovy/operator/TernaryOperatorsTest.groovy
index edb90b580b..950f0727c2 100644
--- a/src/test/groovy/groovy/operator/TernaryOperatorsTest.groovy
+++ b/src/test/groovy/groovy/operator/TernaryOperatorsTest.groovy
@@ -18,7 +18,7 @@
*/
package groovy.operator
-import org.junit.Test
+import org.junit.jupiter.api.Test
import java.util.regex.Pattern
@@ -42,9 +42,8 @@ final class TernaryOperatorsTest {
assertCalledWithFoo(z < 100 ? "bar" : "foo")
}
- void assertCalledWithFoo(param) {
- println "called with param ${param}"
- assert param == "foo"
+ void assertCalledWithFoo(object) {
+ assert object == "foo" : "called with: ${object}"
}
@Test
@@ -57,7 +56,7 @@ final class TernaryOperatorsTest {
}
@Test
- void testElvisOperator() {
+ void testElvisOperator1() {
def a = 1
def x = a?:2
assert x==a
@@ -68,7 +67,10 @@ final class TernaryOperatorsTest {
a = null
x = a?:2
assert x==2
+ }
+ @Test
+ void testElvisOperator2() {
def list = ['a','b','c']
def index = 0
def ret = list[index++]?:"something else"
@@ -79,6 +81,15 @@ final class TernaryOperatorsTest {
assert ret2 == 'b'
}
+ // GROOVY-11747
+ @Test
+ void testElvisOperator3() {
+ long one = 1
+ Long two = 2
+ def wrap = one ?: two
+ assert wrap == 1L
+ }
+
@Test
void testForType() {
boolean b = false