suppress `hoist_props` for embedded assignments (#3074)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 10 Apr 2018 21:19:16 +0000 (05:19 +0800)
committerGitHub <noreply@github.com>
Tue, 10 Apr 2018 21:19:16 +0000 (05:19 +0800)
lib/compress.js
test/compress/hoist_props.js

index 66dc10c..454ce94 100644 (file)
@@ -3639,7 +3639,10 @@ merge(Compressor.prototype, {
         var top_retain = self instanceof AST_Toplevel && compressor.top_retain || return_false;
         var defs_by_id = Object.create(null);
         return self.transform(new TreeTransformer(function(node, descend) {
-            if (node instanceof AST_Assign && node.operator == "=" && can_hoist(node.left, node.right, 1)) {
+            if (node instanceof AST_Assign
+                && node.operator == "="
+                && node.write_only
+                && can_hoist(node.left, node.right, 1)) {
                 descend(node, this);
                 var defs = new Dictionary();
                 var assignments = [];
index 0e39916..46af9d7 100644 (file)
@@ -824,3 +824,35 @@ issue_3071_2_toplevel: {
     }
     expect_stdout: "1"
 }
+
+issue_3071_3: {
+    options = {
+        hoist_props: true,
+        reduce_vars: true,
+    }
+    input: {
+        var c = 0;
+        (function(a, b) {
+            (function f(o) {
+                var n = 2;
+                while (--b + (o = {
+                    p: c++,
+                }) && --n > 0);
+            })();
+        })();
+        console.log(c);
+    }
+    expect: {
+        var c = 0;
+        (function(a, b) {
+            (function f(o) {
+                var n = 2;
+                while (--b + (o = {
+                    p: c++,
+                }) && --n > 0);
+            })();
+        })();
+        console.log(c);
+    }
+    expect_stdout: "2"
+}