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

Reply via email to