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 1faee64300 GROOVY-11828: `instanceof` variable: support closure shared 
usage
1faee64300 is described below

commit 1faee64300f798ae64d76cfacac009a32faf7182
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'
+    }
 }

Reply via email to