Browse Source

check exit conditions for TContinue in side effect handler (closes #3115)

Simon Krajewski 11 years ago
parent
commit
96c5a3d21b
2 changed files with 26 additions and 1 deletions
  1. 11 1
      filters.ml
  2. 15 0
      tests/unit/issues/Issue3115.hx

+ 11 - 1
filters.ml

@@ -123,7 +123,17 @@ let handle_side_effects com gen_temp e =
 			let p = e.epos in
 			let p = e.epos in
 			let e_break = mk TBreak t_dynamic p in
 			let e_break = mk TBreak t_dynamic p in
 			let e_not = mk (TUnop(Not,Prefix,Codegen.mk_parent e1)) e1.etype e1.epos in
 			let e_not = mk (TUnop(Not,Prefix,Codegen.mk_parent e1)) e1.etype e1.epos in
-			let e_if = mk (TIf(e_not,e_break,None)) com.basic.tvoid p in
+			let e_if eo = mk (TIf(e_not,e_break,eo)) com.basic.tvoid p in
+			let rec map_continue e = match e.eexpr with
+				| TContinue ->
+					(e_if (Some e))
+				| TWhile _ | TFor _ ->
+					e
+				| _ ->
+					Type.map_expr map_continue e
+			in
+			let e2 = if flag = NormalWhile then e2 else map_continue e2 in
+			let e_if = e_if None in
 			let e_block = if flag = NormalWhile then Type.concat e_if e2 else Type.concat e2 e_if in
 			let e_block = if flag = NormalWhile then Type.concat e_if e2 else Type.concat e2 e_if in
 			let e_true = mk (TConst (TBool true)) com.basic.tbool p in
 			let e_true = mk (TConst (TBool true)) com.basic.tbool p in
 			let e = mk (TWhile(Codegen.mk_parent e_true,e_block,NormalWhile)) e.etype p in
 			let e = mk (TWhile(Codegen.mk_parent e_true,e_block,NormalWhile)) e.etype p in

+ 15 - 0
tests/unit/issues/Issue3115.hx

@@ -0,0 +1,15 @@
+package unit.issues;
+
+class Issue3115 extends Test {
+	function test() {
+        var k = 0;
+        var i = 0;
+        do {
+            i++;
+            if (i & 1 == 0) continue;
+            k++;
+        } while (i++ < 10);
+		eq(12, i);
+		eq(6, k);
+	}
+}