fix corner case in `arguments` (#4477)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 29 Dec 2020 10:58:29 +0000 (10:58 +0000)
committerGitHub <noreply@github.com>
Tue, 29 Dec 2020 10:58:29 +0000 (18:58 +0800)
fixes #4476

lib/compress.js
test/compress/arrows.js

index 103f47f..0369b63 100644 (file)
@@ -10173,22 +10173,26 @@ merge(Compressor.prototype, {
             var argname = fn.argnames[index];
             if (def.deleted && def.deleted[index]) {
                 argname = null;
-            } else if (argname && !(argname instanceof AST_SymbolFunarg)) {
-                argname = null;
-            } else if (argname && (compressor.has_directive("use strict")
-                || fn.name
-                || !(fn_parent instanceof AST_Call && index < fn_parent.args.length)
-                || !all(fn.argnames, function(argname) {
-                    return argname instanceof AST_SymbolFunarg;
-                }))) {
-                var arg_def = argname.definition();
-                if (!compressor.option("reduce_vars")
-                    || def.reassigned
-                    || arg_def.assignments
-                    || arg_def.orig.length > 1) {
+            } else if (argname) {
+                var arg_def;
+                if (!(argname instanceof AST_SymbolFunarg)) {
                     argname = null;
+                } else if (expr.scope.find_variable(argname.name) !== (arg_def = argname.definition())) {
+                    argname = null;
+                } else if (compressor.has_directive("use strict")
+                    || fn.name
+                    || !(fn_parent instanceof AST_Call && index < fn_parent.args.length)
+                    || !all(fn.argnames, function(argname) {
+                        return argname instanceof AST_SymbolFunarg;
+                    })) {
+                    if (!compressor.option("reduce_vars")
+                        || def.reassigned
+                        || arg_def.assignments
+                        || arg_def.orig.length > 1) {
+                        argname = null;
+                    }
                 }
-            } else if (!argname && index < fn.argnames.length + 5 && compressor.drop_fargs(fn, fn_parent)) {
+            } else if (index < fn.argnames.length + 5 && compressor.drop_fargs(fn, fn_parent)) {
                 while (index >= fn.argnames.length) {
                     argname = fn.make_var(AST_SymbolFunarg, fn, "argument_" + fn.argnames.length);
                     fn.argnames.push(argname);
index 990090b..6d9f89d 100644 (file)
@@ -616,3 +616,25 @@ issue_4448: {
     expect_stdout: "PASS"
     node_version: ">=4"
 }
+
+issue_4476: {
+    options = {
+        arguments: true,
+    }
+    input: {
+        (function(a, b) {
+            (a => {
+                console.log(arguments[0], a);
+            })(b);
+        })("foo", "bar");
+    }
+    expect: {
+        (function(a, b) {
+            (a => {
+                console.log(arguments[0], a);
+            })(b);
+        })("foo", "bar");
+    }
+    expect_stdout: "foo bar"
+    node_version: ">=4"
+}