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() {