瀏覽代碼

sanitize TUnop(op, _, TUnop(op)) (closes #2696)

Simon Krajewski 11 年之前
父節點
當前提交
88b81d40cf
共有 2 個文件被更改,包括 34 次插入7 次删除
  1. 18 7
      optimizer.ml
  2. 16 0
      tests/unit/issues/Issue2696.hx

+ 18 - 7
optimizer.ml

@@ -753,14 +753,25 @@ let sanitize_expr com e =
 		let e1 = if loop e1 true then parent e1 else e1 in
 		let e2 = if loop e2 false then parent e2 else e2 in
 		{ e with eexpr = TBinop (op,e1,e2) }
-	| TUnop (op,mode,e2) ->
-		let rec loop ee =
-			match ee.eexpr with
-			| TBinop _ | TIf _ -> parent e2
-			| TCast (e,None) -> loop e
-			| _ -> e2
+	| TUnop (op,mode,e1) ->
+		let unop op mode e1 =
+			let rec loop ee =
+				match ee.eexpr with
+				| TBinop _ | TIf _ -> parent e1
+				| TCast (e,None) -> loop e
+				| _ -> e1
+			in
+			{ e with eexpr = TUnop (op,mode,loop e1)}
+		in
+		let rec loop e = match e.eexpr with
+			| TUnop((Not | Neg | NegBits) as op2,Prefix,e2) when op = op2 ->
+				e2
+			| TCast(e1,None) | TParenthesis(e1) | TMeta(_, e1) ->
+				loop e1
+			| _ ->
+				unop op mode e1
 		in
-		{ e with eexpr = TUnop (op,mode,loop e2) }
+		loop e1
 	| TIf (e1,e2,eelse) ->
 		let e1 = parent e1 in
 		let e2 = (if (eelse <> None && has_if e2) || (match e2.eexpr with TIf _ -> true | _ -> false) then block e2 else complex e2) in

+ 16 - 0
tests/unit/issues/Issue2696.hx

@@ -0,0 +1,16 @@
+package unit.issues;
+import unit.Test;
+
+
+class Issue2696 extends Test {
+    private static var value = 2;
+
+    inline private static function func() :Int {
+        return -value;
+    }
+
+	function test() {
+		eq(2, -func());
+		eq(2, value);
+	}
+}