Browse Source

handle `while` and `try..catch` in var lazifier filter (fixes #9905)

Aleksandr Kuzmenko 4 years ago
parent
commit
7b4e15617c
2 changed files with 53 additions and 0 deletions
  1. 11 0
      src/filters/varLazifier.ml
  2. 42 0
      tests/unit/src/unit/issues/Issue9905.hx

+ 11 - 0
src/filters/varLazifier.ml

@@ -22,6 +22,17 @@ let apply com e =
 			let _,e2 = loop var_inits e2 in
 			let _,e2 = loop var_inits e2 in
 			let eo = match eo with None -> None | Some e -> Some (snd (loop var_inits e)) in
 			let eo = match eo with None -> None | Some e -> Some (snd (loop var_inits e)) in
 			var_inits,{e with eexpr = TIf(e1,e2,eo)}
 			var_inits,{e with eexpr = TIf(e1,e2,eo)}
+		| TWhile(e1,e2,flag) ->
+			let var_inits,e1 = loop var_inits e1 in
+			let _,e2 = loop var_inits e2 in
+			var_inits,{e with eexpr = TWhile(e1,e2,flag)}
+		| TTry(e1,catches) ->
+			let _,e1 = loop var_inits e1 in
+			let catches = List.map (fun (v,e) ->
+				let _,e = loop var_inits e in
+				(v,e)
+			) catches in
+			var_inits,{e with eexpr = TTry(e1,catches)}
 		| TSwitch(e1,cases,edef) ->
 		| TSwitch(e1,cases,edef) ->
 			let var_inits,e1 = loop var_inits e1 in
 			let var_inits,e1 = loop var_inits e1 in
 			let cases = List.map (fun (el,e) ->
 			let cases = List.map (fun (el,e) ->

+ 42 - 0
tests/unit/src/unit/issues/Issue9905.hx

@@ -0,0 +1,42 @@
+package unit.issues;
+
+class Issue9905 extends unit.Test {
+	function test() {
+		var v = Std.random(10);
+		var v1 = -1;
+		var v2 = switch v {
+			case (
+				_ =>
+				({
+					while(Std.random(1) > 0) {
+						v1 = _;
+					}
+					v1 = _;
+				})
+				=> v3
+			):
+				v3;
+		}
+		eq(v, v1);
+		eq(v, v2);
+
+		var v = Std.random(10);
+		var v1 = -1;
+		var v2 = switch v {
+			case (
+				_ =>
+				({
+					try {
+						v1 = _;
+					} catch(e) {
+						_;
+					}
+				})
+				=> v3
+			):
+				v3;
+		}
+		eq(v, v1);
+		eq(v, v2);
+	}
+}