Browse Source

[matcher] generate bool switch as if

closes #5646
Simon Krajewski 6 năm trước cách đây
mục cha
commit
92bfa33cba
2 tập tin đã thay đổi với 42 bổ sung3 xóa
  1. 7 3
      src/typing/matcher.ml
  2. 35 0
      tests/optimization/src/issues/Issue5646.hx

+ 7 - 3
src/typing/matcher.ml

@@ -1459,10 +1459,11 @@ module TexprConverter = struct
 							| SKEnum -> if match_debug then mk_name_call e_subject else mk_index_call e_subject
 							| SKLength -> type_field_access ctx e_subject "length"
 						in
-						begin match cases with
-							| [_,e2] when e_default = None && (match finiteness with RunTimeFinite -> true | _ -> false) ->
+						begin match cases,e_default,with_type with
+							| [_,e2],None,_ when (match finiteness with RunTimeFinite -> true | _ -> false) ->
 								{e2 with etype = t_switch}
-							| [[e1],e2] when (with_type = NoValue || e_default <> None) && ctx.com.platform <> Java (* TODO: problem with TestJava.hx:285 *) ->
+							| [[e1],e2],Some _,_
+							| [[e1],e2],None,NoValue when ctx.com.platform <> Java (* TODO: problem with TestJava.hx:285 *) ->
 								let e_op = mk (TBinop(OpEq,e_subject,e1)) ctx.t.tbool e_subject.epos in
 								begin match e2.eexpr with
 									| TIf(e_op2,e3,e_default2) when (match e_default,e_default2 with Some(e1),Some(e2) when e1 == e2 -> true | _ -> false) ->
@@ -1471,6 +1472,9 @@ module TexprConverter = struct
 									| _ ->
 										mk (TIf(e_op,e2,e_default)) t_switch dt.dt_pos
 								end
+							| [([{eexpr = TConst (TBool true)}],e1);([{eexpr = TConst (TBool false)}],e2)],None,_
+							| [([{eexpr = TConst (TBool false)}],e2);([{eexpr = TConst (TBool true)}],e1)],None,_ ->
+								mk (TIf(e_subject,e1,Some e2)) t_switch dt.dt_pos
 							| _ ->
 								let e_subject = match finiteness with
 									| RunTimeFinite | CompileTimeFinite when e_default = None ->

+ 35 - 0
tests/optimization/src/issues/Issue5646.hx

@@ -0,0 +1,35 @@
+package issues;
+
+class Issue5646 {
+	static var mode = true;
+
+	@:js('
+		if(issues_Issue5646.mode) {
+			issues_Issue5646.use("a");
+		} else {
+			issues_Issue5646.use("b");
+		}
+	')
+	static function test1() {
+        switch (mode) {
+            case true: use("a");
+            case false: use("b");
+        }
+	}
+
+	@:js('
+		if(issues_Issue5646.mode) {
+			issues_Issue5646.use("a");
+		} else {
+			issues_Issue5646.use("b");
+		}
+	')
+	static function test2() {
+        switch (mode) {
+			case false: use("b");
+            case true: use("a");
+        }
+	}
+
+	@:pure(false) static function use(a) { }
+}