fix corner case in `reduce_vars` (#4654)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 15 Feb 2021 22:46:45 +0000 (22:46 +0000)
committerGitHub <noreply@github.com>
Mon, 15 Feb 2021 22:46:45 +0000 (06:46 +0800)
fixes #4653

lib/compress.js
test/compress/merge_vars.js

index 5adeb56..b4f9c3a 100644 (file)
@@ -853,18 +853,21 @@ merge(Compressor.prototype, {
             }
             return true;
 
-            function walk_prop(node) {
-                if (node instanceof AST_Dot) {
-                    walk_prop(node.expression);
-                } else if (node instanceof AST_Sub) {
-                    walk_prop(node.expression);
-                    node.property.walk(tw);
-                } else if (node instanceof AST_SymbolRef) {
-                    var d = node.definition();
-                    push_ref(d, node);
-                    node.fixed = d.fixed;
+            function walk_prop(lhs) {
+                if (lhs instanceof AST_Dot) {
+                    walk_prop(lhs.expression);
+                } else if (lhs instanceof AST_Sub) {
+                    walk_prop(lhs.expression);
+                    lhs.property.walk(tw);
+                } else if (lhs instanceof AST_SymbolRef) {
+                    var d = lhs.definition();
+                    push_ref(d, lhs);
+                    if (d.fixed) {
+                        lhs.fixed = d.fixed;
+                        lhs.fixed.assigns = [ node ];
+                    }
                 } else {
-                    node.walk(tw);
+                    lhs.walk(tw);
                 }
             }
         });
index 02d17d3..c45f835 100644 (file)
@@ -3212,3 +3212,30 @@ issue_4628: {
     }
     expect_stdout: "undefined"
 }
+
+issue_4653: {
+    options = {
+        evaluate: true,
+        merge_vars: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var a = 1, b;
+        function f(c, d) {
+            c || console.log(d);
+        }
+        f(a++ + (b = b), b |= console.log(a));
+    }
+    expect: {
+        var b = 1;
+        (function(c, d) {
+            c || console.log(d);
+        })(+b + (b = void 0), b |= console.log(2));
+    }
+    expect_stdout: [
+        "2",
+        "0",
+    ]
+}