fix corner case in `merge_vars` (#4635)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 10 Feb 2021 01:13:38 +0000 (01:13 +0000)
committerGitHub <noreply@github.com>
Wed, 10 Feb 2021 01:13:38 +0000 (09:13 +0800)
lib/compress.js
test/compress/yields.js

index 3fcfe2d..b35fc6a 100644 (file)
@@ -5045,6 +5045,7 @@ merge(Compressor.prototype, {
         return self;
     });
 
+    var NO_MERGE = makePredicate("arguments await yield");
     AST_Scope.DEFMETHOD("merge_variables", function(compressor) {
         if (!compressor.option("merge_vars")) return;
         var self = this, segment = {}, root;
@@ -5386,7 +5387,7 @@ merge(Compressor.prototype, {
             } else if ((ldef = self.variables.get(def.name)) !== def) {
                 if (ldef && root === segment) references[ldef.id] = false;
                 return references[def.id] = false;
-            } else if (compressor.exposed(def) || sym.name == "arguments" || sym.name == "await") {
+            } else if (compressor.exposed(def) || NO_MERGE[sym.name]) {
                 return references[def.id] = false;
             } else {
                 var refs = declarations.get(def.id) || [];
index 7f85059..5a6948e 100644 (file)
@@ -602,6 +602,62 @@ inline_nested_yield: {
     node_version: ">=4"
 }
 
+issue_4454_1: {
+    rename = false
+    options = {
+        merge_vars: true,
+    }
+    input: {
+        function f(a) {
+            (function*(b = console.log(a)) {})();
+            var yield = 42..toString();
+            console.log(yield);
+        }
+        f("PASS");
+    }
+    expect: {
+        function f(a) {
+            (function*(b = console.log(a)) {})();
+            var yield = 42..toString();
+            console.log(yield);
+        }
+        f("PASS");
+    }
+    expect_stdout: [
+        "PASS",
+        "42",
+    ]
+    node_version: ">=6"
+}
+
+issue_4454_2: {
+    rename = true
+    options = {
+        merge_vars: true,
+    }
+    input: {
+        function f(a) {
+            (function*(b = console.log(a)) {})();
+            var yield = 42..toString();
+            console.log(yield);
+        }
+        f("PASS");
+    }
+    expect: {
+        function f(b) {
+            (function*(c = console.log(b)) {})();
+            var b = 42..toString();
+            console.log(b);
+        }
+        f("PASS");
+    }
+    expect_stdout: [
+        "PASS",
+        "42",
+    ]
+    node_version: ">=6"
+}
+
 issue_4618: {
     options = {
         functions: true,