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

[dce] clean up operator handling

closes #11427
Simon Krajewski 1 жил өмнө
parent
commit
787c3a406d

+ 19 - 7
src/optimization/dce.ml

@@ -511,6 +511,15 @@ and expr_field dce e fa is_call_expr =
 	end;
 	end;
 	expr dce e;
 	expr dce e;
 
 
+and check_op dce op = match op with
+	| OpMod ->
+		check_and_add_feature dce "binop_%";
+	| OpUShr ->
+		check_and_add_feature dce "binop_>>>";
+	| OpAssignOp op ->
+		check_op dce op
+	| _ ->
+		()
 
 
 and expr dce e =
 and expr dce e =
 	mark_t dce e.epos e.etype;
 	mark_t dce e.epos e.etype;
@@ -605,10 +614,15 @@ and expr dce e =
 		check_and_add_feature dce "dynamic_array_read";
 		check_and_add_feature dce "dynamic_array_read";
 		expr dce e1;
 		expr dce e1;
 		expr dce e2;
 		expr dce e2;
-	| TBinop( (OpAssign | OpAssignOp _), ({eexpr = TArray({etype = TDynamic None},_)} as e1), e2) ->
+	| TBinop(OpAssign, ({eexpr = TArray({etype = TDynamic None},_)} as e1), e2) ->
 		check_and_add_feature dce "dynamic_array_write";
 		check_and_add_feature dce "dynamic_array_write";
 		expr dce e1;
 		expr dce e1;
 		expr dce e2;
 		expr dce e2;
+	| TBinop(OpAssignOp op, ({eexpr = TArray({etype = TDynamic None},_)} as e1), e2) ->
+		check_op dce op;
+		check_and_add_feature dce "dynamic_array_write";
+		expr dce e1;
+		expr dce e2;		
 	| TArray(({etype = t} as e1),e2) when is_array t ->
 	| TArray(({etype = t} as e1),e2) when is_array t ->
 		check_and_add_feature dce "array_read";
 		check_and_add_feature dce "array_read";
 		expr dce e1;
 		expr dce e1;
@@ -629,10 +643,12 @@ and expr dce e =
 		expr dce e1;
 		expr dce e1;
 		expr dce e2;
 		expr dce e2;
 	| TBinop(OpAssignOp op,({eexpr = TField(_,(FDynamic _ as fa) )} as e1),e2) ->
 	| TBinop(OpAssignOp op,({eexpr = TField(_,(FDynamic _ as fa) )} as e1),e2) ->
+		check_op dce op;
 		check_dynamic_write dce fa;
 		check_dynamic_write dce fa;
 		expr dce e1;
 		expr dce e1;
 		expr dce e2;
 		expr dce e2;
 	| TBinop(OpAssignOp op,({eexpr = TField(_,(FAnon cf as fa) )} as e1),e2) ->
 	| TBinop(OpAssignOp op,({eexpr = TField(_,(FAnon cf as fa) )} as e1),e2) ->
+		check_op dce op;
 		if Meta.has Meta.Optional cf.cf_meta then
 		if Meta.has Meta.Optional cf.cf_meta then
 			check_anon_optional_write dce fa
 			check_anon_optional_write dce fa
 		else
 		else
@@ -655,12 +671,8 @@ and expr dce e =
 		check_and_add_feature dce "type_param_binop_!=";
 		check_and_add_feature dce "type_param_binop_!=";
 		expr dce e1;
 		expr dce e1;
 		expr dce e2;
 		expr dce e2;
-	| TBinop(OpMod,e1,e2) ->
-		check_and_add_feature dce "binop_%";
-		expr dce e1;
-		expr dce e2;
-	| TBinop((OpUShr | OpAssignOp OpUShr),e1,e2) ->
-		check_and_add_feature dce "binop_>>>";
+	| TBinop(op,e1,e2) ->
+		check_op dce op;
 		expr dce e1;
 		expr dce e1;
 		expr dce e2;
 		expr dce e2;
 	| TCall(({ eexpr = TField(ef, fa) } as e2), el ) ->
 	| TCall(({ eexpr = TField(ef, fa) } as e2), el ) ->

+ 7 - 0
tests/misc/python/projects/Issue11427/Main.hx

@@ -0,0 +1,7 @@
+class Main {
+	public static function main() {
+		var a:Int = -5;
+		a = a % 7;
+		trace(a);
+	}
+}

+ 3 - 0
tests/misc/python/projects/Issue11427/build.hxml

@@ -0,0 +1,3 @@
+-python bin/main.py
+--main Main
+-cmd python3 bin/main.py

+ 1 - 0
tests/misc/python/projects/Issue11427/build.hxml.stdout

@@ -0,0 +1 @@
+-5