fix corner case in `merge_vars` (#4170)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 2 Oct 2020 23:03:39 +0000 (00:03 +0100)
committerGitHub <noreply@github.com>
Fri, 2 Oct 2020 23:03:39 +0000 (07:03 +0800)
fixes #4168

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

index 27ddd22..513528e 100644 (file)
@@ -4406,7 +4406,12 @@ merge(Compressor.prototype, {
                 push();
                 segment.block = node;
                 if (node === self) root = segment;
-                if (node instanceof AST_Lambda && node.name) references[node.name.definition().id] = false;
+                if (node instanceof AST_Lambda) {
+                    if (node.name) references[node.name.definition().id] = false;
+                    if (node.uses_arguments && !tw.has_directive("use strict")) node.argnames.forEach(function(node) {
+                        references[node.definition().id] = false;
+                    });
+                }
                 descend();
                 pop();
                 return true;
@@ -4474,6 +4479,7 @@ merge(Compressor.prototype, {
                 return true;
             }
         });
+        tw.directives = Object.create(compressor.directives);
         self.walk(tw);
         var merged = Object.create(null);
         while (first.length && last.length) {
index 5f4b660..a12781d 100644 (file)
@@ -2928,3 +2928,83 @@ issue_4157_2: {
     }
     expect_stdout: "undefined"
 }
+
+issue_4168: {
+    options = {
+        merge_vars: true,
+    }
+    input: {
+        var o = {
+            f: function(a, b, c) {
+                var d = a.d;
+                var e = b.e;
+                var f = c.f;
+                this.g(arguments);
+                if (d)
+                    console.log(e, f);
+            },
+            g: function(args) {
+                console.log(args[0], args[1], args[2]);
+            },
+        };
+        o.f("PASS", true, 42);
+    }
+    expect: {
+        var o = {
+            f: function(a, b, c) {
+                var d = a.d;
+                var e = b.e;
+                var f = c.f;
+                this.g(arguments);
+                if (d)
+                    console.log(e, f);
+            },
+            g: function(args) {
+                console.log(args[0], args[1], args[2]);
+            },
+        };
+        o.f("PASS", true, 42);
+    }
+    expect_stdout: "PASS true 42"
+}
+
+issue_4168_use_strict: {
+    options = {
+        merge_vars: true,
+    }
+    input: {
+        "use strict";
+        var o = {
+            f: function(a, b, c) {
+                var d = a.d;
+                var e = b.e;
+                var f = c.f;
+                this.g(arguments);
+                if (d)
+                    console.log(e, f);
+            },
+            g: function(args) {
+                console.log(args[0], args[1], args[2]);
+            },
+        };
+        o.f("PASS", true, 42);
+    }
+    expect: {
+        "use strict";
+        var o = {
+            f: function(d, e, f) {
+                var d = d.d;
+                var e = e.e;
+                var f = f.f;
+                this.g(arguments);
+                if (d)
+                    console.log(e, f);
+            },
+            g: function(args) {
+                console.log(args[0], args[1], args[2]);
+            },
+        };
+        o.f("PASS", true, 42);
+    }
+    expect_stdout: "PASS true 42"
+}