2
0
Эх сурвалжийг харах

don't remove enumIndex optimizations because EnumFlags is super important

Simon Krajewski 8 жил өмнө
parent
commit
dbc087aad9

+ 19 - 1
src/optimization/analyzer.ml

@@ -425,6 +425,15 @@ module ConstPropagation = DataFlow(struct
 					| EnumValue(i,_) -> Const (TInt (Int32.of_int i))
 					| _ -> raise Exit
 				end;
+			| TCall ({ eexpr = TField (_,FStatic({cl_path=[],"Type"} as c,({cf_name="enumIndex"} as cf)))},[e1]) when ctx.com.platform = Eval ->
+				begin match follow e1.etype,eval bb e1 with
+					| TEnum _,EnumValue(i,_) -> Const (TInt (Int32.of_int i))
+					| _,e1 ->
+						begin match Optimizer.api_inline2 ctx.com c cf.cf_name [wrap e1] e.epos with
+							| None -> raise Exit
+							| Some e -> eval bb e
+						end
+				end
 			| TCall ({ eexpr = TField (_,FStatic(c,cf))},el) ->
 				let el = List.map (eval bb) el in
 				let el = List.map wrap el in
@@ -435,7 +444,16 @@ module ConstPropagation = DataFlow(struct
 			| TParenthesis e1 | TMeta(_,e1) | TCast(e1,None) ->
 				eval bb e1
 			| _ ->
-				raise Exit
+				let e1 = match ctx.com.platform,e.eexpr with
+					| Js,TArray(e1,{eexpr = TConst(TInt i)}) when Int32.to_int i = 1 -> e1
+					| Cpp,TCall({eexpr = TField(e1,FDynamic "__Index")},[]) -> e1
+					| Neko,TField(e1,FDynamic "index") -> e1
+					| _ -> raise Exit
+				in
+				begin match follow e1.etype,eval bb e1 with
+					| TEnum _,EnumValue(i,_) -> Const (TInt (Int32.of_int i))
+					| _ -> raise Exit
+				end
 		in
 		try
 			eval bb e

+ 2 - 2
tests/optimization/src/TestAnalyzer.hx

@@ -737,8 +737,8 @@ class TestAnalyzer extends TestBase {
 		var fromCharCode = String.fromCharCode(i);
 		assertEqualsConst("A", fromCharCode);
 
-		// var enumIndex = Type.enumIndex(eBreak);
-		// assertEqualsConst(20, enumIndex);
+		var enumIndex = Type.enumIndex(eBreak);
+		assertEqualsConst(20, enumIndex);
 	}
 
 	function testWhilePrune1() {

+ 35 - 35
tests/optimization/src/TestJs.hx

@@ -201,41 +201,41 @@ class TestJs {
 		use(a + b);
 	}
 
-	// @:js('
-	// 	TestJs["use"](false);
-	// 	TestJs["use"](true);
-	// 	TestJs["use"](true);
-	// 	TestJs["use"](true);
-	// 	TestJs["use"](false);
-	// 	TestJs["use"](true);
-	// 	TestJs["use"](true);
-	// 	TestJs["use"](false);
-	// 	TestJs["use"](false);
-	// 	TestJs["use"](true);
-	// 	TestJs["use"](false);
-	// ')
-	// static function testEnumValueFlags() {
-	// 	var flags = new haxe.EnumFlags();
-	// 	use(flags.has(EA));
-	// 	flags = new haxe.EnumFlags(1);
-	// 	use(flags.has(EA));
-
-	// 	// set
-	// 	flags.set(EB);
-	// 	use(flags.has(EA));
-	// 	use(flags.has(EB));
-	// 	use(flags.has(EC));
-
-	// 	// unset
-	// 	flags.unset(EC);
-	// 	use(flags.has(EA));
-	// 	use(flags.has(EB));
-	// 	use(flags.has(EC));
-	// 	flags.unset(EA);
-	// 	use(flags.has(EA));
-	// 	use(flags.has(EB));
-	// 	use(flags.has(EC));
-	// }
+	@:js('
+		TestJs["use"](false);
+		TestJs["use"](true);
+		TestJs["use"](true);
+		TestJs["use"](true);
+		TestJs["use"](false);
+		TestJs["use"](true);
+		TestJs["use"](true);
+		TestJs["use"](false);
+		TestJs["use"](false);
+		TestJs["use"](true);
+		TestJs["use"](false);
+	')
+	static function testEnumValueFlags() {
+		var flags = new haxe.EnumFlags();
+		use(flags.has(EA));
+		flags = new haxe.EnumFlags(1);
+		use(flags.has(EA));
+
+		// set
+		flags.set(EB);
+		use(flags.has(EA));
+		use(flags.has(EB));
+		use(flags.has(EC));
+
+		// unset
+		flags.unset(EC);
+		use(flags.has(EA));
+		use(flags.has(EB));
+		use(flags.has(EC));
+		flags.unset(EA);
+		use(flags.has(EA));
+		use(flags.has(EB));
+		use(flags.has(EC));
+	}
 
 	@:js('
 		var map = new haxe_ds_StringMap();