Browse Source

consider capture var read/write as side-effect (closes #5911)

Simon Krajewski 8 years ago
parent
commit
de17354927
3 changed files with 26 additions and 1 deletions
  1. 6 0
      extra/CHANGES.txt
  2. 7 1
      src/optimization/analyzerTexpr.ml
  3. 13 0
      tests/unit/src/unit/issues/Issue5911.hx

+ 6 - 0
extra/CHANGES.txt

@@ -1,3 +1,9 @@
+2017-??-??: 3.4.0
+
+	Bugfixes:
+
+	all : fixed issue with side-effect detection when optimizing (#5911)
+
 2016-12-24: 3.4.0-RC2
 2016-12-24: 3.4.0-RC2
 
 
 	New features:
 	New features:

+ 7 - 1
src/optimization/analyzerTexpr.ml

@@ -369,13 +369,19 @@ module InterferenceReport = struct
 		let rec loop e = match e.eexpr with
 		let rec loop e = match e.eexpr with
 			(* vars *)
 			(* vars *)
 			| TLocal v ->
 			| TLocal v ->
-				set_var_read ir v
+				set_var_read ir v;
+				if v.v_capture then set_state_read ir;
 			| TBinop(OpAssign,{eexpr = TLocal v},e2) ->
 			| TBinop(OpAssign,{eexpr = TLocal v},e2) ->
 				set_var_write ir v;
 				set_var_write ir v;
+				if v.v_capture then set_state_write ir;
 				loop e2
 				loop e2
 			| TBinop(OpAssignOp _,{eexpr = TLocal v},e2) ->
 			| TBinop(OpAssignOp _,{eexpr = TLocal v},e2) ->
 				set_var_read ir v;
 				set_var_read ir v;
 				set_var_write ir v;
 				set_var_write ir v;
+				if v.v_capture then begin
+					set_state_read ir;
+					set_state_write ir;
+				end;
 				loop e2
 				loop e2
 			| TUnop((Increment | Decrement),_,{eexpr = TLocal v}) ->
 			| TUnop((Increment | Decrement),_,{eexpr = TLocal v}) ->
 				set_var_read ir v;
 				set_var_read ir v;

+ 13 - 0
tests/unit/src/unit/issues/Issue5911.hx

@@ -0,0 +1,13 @@
+package unit.issues;
+
+class Issue5911 extends unit.Test {
+	function test() {
+		var x = 5;
+		var advance = function () {
+			x++;
+		};
+		var cur = x;
+		advance();
+		eq(5, cur);
+	}
+}