fix corner case in `hoist_vars` (#4840)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 3 Apr 2021 02:07:18 +0000 (03:07 +0100)
committerGitHub <noreply@github.com>
Sat, 3 Apr 2021 02:07:18 +0000 (10:07 +0800)
fixes #4839

lib/compress.js
test/compress/hoist_vars.js

index 2c1757b..0150ba3 100644 (file)
@@ -6937,7 +6937,9 @@ merge(Compressor.prototype, {
                         && vars.has(sym.name)) {
                         var def = vars.get(sym.name);
                         if (def.value) break;
-                        def.value = expr.right.clone();
+                        var value = expr.right;
+                        if (value instanceof AST_Sequence) value = value.clone();
+                        def.value = value;
                         remove(defs, def);
                         defs.push(def);
                         body.shift();
index 4118f76..8db060d 100644 (file)
@@ -140,7 +140,6 @@ issue_4487: {
         functions: true,
         hoist_vars: true,
         keep_fnames: true,
-        passes: 2,
         reduce_vars: true,
         toplevel: true,
         unused: true,
@@ -240,3 +239,29 @@ issue_4736: {
     }
     expect_stdout: "1073741824"
 }
+
+issue_4839: {
+    options = {
+        evaluate: true,
+        hoist_vars: true,
+        keep_fargs: false,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var o = function(a, b) {
+            return b && b;
+        }("foo");
+        for (var k in o)
+            throw "FAIL";
+        console.log("PASS");
+    }
+    expect: {
+        var k, o = void 0;
+        for (k in o)
+            throw "FAIL";
+        console.log("PASS");
+    }
+    expect_stdout: "PASS"
+}