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 644796c7bc GROOVY-11828: `instanceof` variable: support closure shared
usage
644796c7bc is described below
commit 644796c7bc713a0e99c9e8458956f078f76af3c3
Author: Eric Milles <[email protected]>
AuthorDate: Mon Dec 29 18:25:18 2025 -0600
GROOVY-11828: `instanceof` variable: support closure shared usage
---
.../codehaus/groovy/classgen/asm/BinaryExpressionHelper.java | 11 ++++++++++-
src/test/groovy/groovy/InstanceofTest.groovy | 10 ++++++++++
2 files changed, 20 insertions(+), 1 deletion(-)
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 dfca7097a4..3b695c59a7 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
@@ -120,7 +120,9 @@ import static org.objectweb.asm.Opcodes.IFEQ;
import static org.objectweb.asm.Opcodes.IFNE;
import static org.objectweb.asm.Opcodes.IF_ACMPEQ;
import static org.objectweb.asm.Opcodes.INSTANCEOF;
+import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
import static org.objectweb.asm.Opcodes.POP;
+import static org.objectweb.asm.Opcodes.SWAP;
public class BinaryExpressionHelper {
// compare
@@ -783,7 +785,14 @@ public class BinaryExpressionHelper {
Label l0 = operandStack.jump(IFEQ); // skip store if not instanceof
mv.visitTypeInsn(CHECKCAST, typeName);
- mv.visitVarInsn(ASTORE, v.getIndex());
+ if (!v.isHolder()) {
+ mv.visitVarInsn(ASTORE, v.getIndex());
+ } else { // GROOVY-11828: shared variable
+ mv.visitVarInsn(ALOAD, v.getIndex());
+ mv.visitTypeInsn(CHECKCAST, "groovy/lang/Reference");
+ mv.visitInsn(SWAP);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "groovy/lang/Reference",
"set", "(Ljava/lang/Object;)V", false);
+ }
Label l1 = operandStack.jump(GOTO);
mv.visitLabel(l0); // stack: ..., check, value
diff --git a/src/test/groovy/groovy/InstanceofTest.groovy
b/src/test/groovy/groovy/InstanceofTest.groovy
index 01b4349791..f7092fb232 100644
--- a/src/test/groovy/groovy/InstanceofTest.groovy
+++ b/src/test/groovy/groovy/InstanceofTest.groovy
@@ -213,4 +213,14 @@ final class InstanceofTest {
'''
assert err =~ /The variable .i. is undeclared\.\s+@ line 4, column 13/
}
+
+ // GROOVY-11828
+ @Test
+ void testVariableShare() {
+ def x = 'foo', y
+ if (x instanceof String s) {
+ y = { -> s + 'bar' }()
+ }
+ assert y == 'foobar'
+ }
}