This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY-7463
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY-7463 by this push:
     new 6475e816aa GROOVY-6844: `break` out of named block statement
6475e816aa is described below

commit 6475e816aad2ea557014d520d8285d276460a659
Author: Eric Milles <[email protected]>
AuthorDate: Tue Jan 20 11:57:41 2026 -0600

    GROOVY-6844: `break` out of named block statement
---
 .../groovy/classgen/asm/StatementWriter.java       | 15 ++++++++++---
 .../groovy/groovy/BreakContinueLabelTest.groovy    | 25 +++++++++++++++++++++-
 2 files changed, 36 insertions(+), 4 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java 
b/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java
index 1a46fc2175..bd447084f7 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/StatementWriter.java
@@ -87,15 +87,24 @@ public class StatementWriter {
     public void writeBlockStatement(final BlockStatement block) {
         writeStatementLabel(block);
 
-        int mark = controller.getOperandStack().getStackLength();
         CompileStack compileStack = controller.getCompileStack();
+        OperandStack operandStack = controller.getOperandStack();
+
+        int mark = operandStack.getStackLength();
         compileStack.pushVariableScope(block.getVariableScope());
+        List<String> labels = block.getStatementLabels(); // GROOVY-6844
+        Label end = (labels != null && !labels.isEmpty()) ? 
compileStack.pushBreakable(labels) : null;
+
         for (Statement statement : block.getStatements()) {
             statement.visit(controller.getAcg());
         }
-        compileStack.pop();
 
-        controller.getOperandStack().popDownTo(mark);
+        if (end != null) {
+            controller.getMethodVisitor().visitLabel(end);
+            compileStack.pop();
+        }
+        compileStack.pop();
+        operandStack.popDownTo(mark);
     }
 
     public void writeForStatement(final ForStatement statement) {
diff --git a/src/test/groovy/groovy/BreakContinueLabelTest.groovy 
b/src/test/groovy/groovy/BreakContinueLabelTest.groovy
index a865e009ea..d77440cde9 100644
--- a/src/test/groovy/groovy/BreakContinueLabelTest.groovy
+++ b/src/test/groovy/groovy/BreakContinueLabelTest.groovy
@@ -26,7 +26,7 @@ import static groovy.test.GroovyAssert.shouldFail
 final class BreakContinueLabelTest {
 
     @Test
-    void testDeclareSimpleLabels() {
+    void testDeclareLabels() {
         assertScript '''
             label_1: print('foo')
             label_2:
@@ -210,6 +210,29 @@ final class BreakContinueLabelTest {
         '''
     }
 
+    // GROOVY-6844
+    @Test
+    void testBreakLabelInForLoopWithinBlockStatement() {
+        assertScript '''
+            int i = 0
+            out: {
+                i += 1
+                for (j in 1..3) {
+                    try {
+                        i += 10
+                        break out
+                        assert false : 'did not break try properly'
+                    } finally {
+                        i += 100
+                    }
+                    assert false : 'did not break loop properly'
+                }
+                assert false : 'did not break block properly'
+            }
+            assert i == 111
+        '''
+    }
+
     // GROOVY-11739
     @Test
     void testContinueWithinDoWhileLoop() {

Reply via email to