Revision: 8204
Author: sp...@google.com
Date: Mon May 24 15:16:48 2010
Log: [GFlow] Supporting break statement outside of loops.
Review at http://gwt-code-reviews.appspot.com/553801
Review by: aizat...@google.com
http://code.google.com/p/google-web-toolkit/source/detail?r=8204
Modified:
/branches/2.1/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilder.java
/branches/2.1/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilderTest.java
=======================================
---
/branches/2.1/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilder.java
Fri Apr 16 15:40:06 2010
+++
/branches/2.1/dev/core/src/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilder.java
Mon May 24 15:16:48 2010
@@ -536,8 +536,11 @@
@Override
public boolean visit(JLabeledStatement x, Context ctx) {
- labels.put(x.getBody(), x.getLabel().getName());
- return true;
+ String label = x.getLabel().getName();
+ labels.put(x.getBody(), label);
+ accept(x.getBody());
+ addBreakExits(label);
+ return false;
}
/**
=======================================
---
/branches/2.1/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilderTest.java
Fri Apr 16 15:40:06 2010
+++
/branches/2.1/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/cfg/CfgBuilderTest.java
Mon May 24 15:16:48 2010
@@ -1279,6 +1279,7 @@
"9: END"
);
}
+
public void testSwitchWithLoopAndBreak() throws Exception {
assertCfg("void",
"switch(i) {",
@@ -1315,7 +1316,89 @@
"3: END"
);
}
-
+
+ public void testBreakStatement1() throws Exception {
+ assertCfg("void",
+ "lbl: {",
+ " break lbl;",
+ "}"
+ ).is(
+ "BLOCK -> [*]",
+ "BLOCK -> [*]",
+ "STMT -> [*]",
+ "GOTO -> [*]",
+ "END");
+ }
+
+ public void testBreakStatement2() throws Exception {
+ assertCfg("void",
+ "lbl: break lbl;"
+ ).is(
+ "BLOCK -> [*]",
+ "STMT -> [*]",
+ "GOTO -> [*]",
+ "END");
+ }
+
+ public void testBreakStatement3() throws Exception {
+ assertCfg("void",
+ "lbl: {",
+ " i = 1;",
+ " if (b) break lbl;",
+ " i = 2;",
+ "}"
+ ).is(
+ "BLOCK -> [*]",
+ "BLOCK -> [*]",
+ "STMT -> [*]",
+ "WRITE(i, 1) -> [*]",
+ "STMT -> [*]",
+ "READ(b) -> [*]",
+ "COND (EntryPoint.b) -> [THEN=*, ELSE=1]",
+ "STMT -> [*]",
+ "GOTO -> [2]",
+ "1: STMT -> [*]",
+ "WRITE(i, 2) -> [*]",
+ "2: END");
+ }
+
+ public void testBreakStatement4() throws Exception {
+ assertCfg("void",
+ "lbl1: {",
+ " i = 1;",
+ " lbl2: {",
+ " j = 1;",
+ " if (b) break lbl1;",
+ " j = 2;",
+ " if (b) break lbl2;",
+ " }",
+ " i = 2;",
+ "}"
+ ).is(
+ "BLOCK -> [*]",
+ "BLOCK -> [*]",
+ "STMT -> [*]",
+ "WRITE(i, 1) -> [*]",
+ "BLOCK -> [*]",
+ "STMT -> [*]",
+ "WRITE(j, 1) -> [*]",
+ "STMT -> [*]",
+ "READ(b) -> [*]",
+ "COND (EntryPoint.b) -> [THEN=*, ELSE=1]",
+ "STMT -> [*]",
+ "GOTO -> [3]",
+ "1: STMT -> [*]",
+ "WRITE(j, 2) -> [*]",
+ "STMT -> [*]",
+ "READ(b) -> [*]",
+ "COND (EntryPoint.b) -> [THEN=*, ELSE=2]",
+ "STMT -> [*]",
+ "GOTO -> [*]",
+ "2: STMT -> [*]",
+ "WRITE(i, 2) -> [*]",
+ "3: END");
+ }
+
private CfgBuilderResult assertCfg(String returnType,
String ...codeSnippet)
throws UnableToCompleteException {
JProgram program = compileSnippet(returnType,
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors