fix corner case in arguments (#4477)

fixes #4476
This commit is contained in:
Alex Lam S.L
2020-12-29 10:58:29 +00:00
committed by GitHub
parent ddc0ed7072
commit 10a71c182b
2 changed files with 40 additions and 14 deletions

View File

@@ -10173,22 +10173,26 @@ merge(Compressor.prototype, {
var argname = fn.argnames[index]; var argname = fn.argnames[index];
if (def.deleted && def.deleted[index]) { if (def.deleted && def.deleted[index]) {
argname = null; argname = null;
} else if (argname && !(argname instanceof AST_SymbolFunarg)) { } else if (argname) {
argname = null; var arg_def;
} else if (argname && (compressor.has_directive("use strict") if (!(argname instanceof AST_SymbolFunarg)) {
|| 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) {
argname = null; 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) { while (index >= fn.argnames.length) {
argname = fn.make_var(AST_SymbolFunarg, fn, "argument_" + fn.argnames.length); argname = fn.make_var(AST_SymbolFunarg, fn, "argument_" + fn.argnames.length);
fn.argnames.push(argname); fn.argnames.push(argname);

View File

@@ -616,3 +616,25 @@ issue_4448: {
expect_stdout: "PASS" expect_stdout: "PASS"
node_version: ">=4" 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"
}