handle duplicate argument names in collapse_vars (#2215)

This commit is contained in:
Alex Lam S.L
2017-07-08 04:42:35 +08:00
committed by GitHub
parent 4f70d2e28c
commit 71ee91e716
2 changed files with 29 additions and 3 deletions

View File

@@ -820,7 +820,11 @@ merge(Compressor.prototype, {
&& !fn.uses_eval && !fn.uses_eval
&& (iife = compressor.parent()) instanceof AST_Call && (iife = compressor.parent()) instanceof AST_Call
&& iife.expression === fn) { && iife.expression === fn) {
fn.argnames.forEach(function(sym, i) { var names = Object.create(null);
for (var i = fn.argnames.length; --i >= 0;) {
var sym = fn.argnames[i];
if (sym.name in names) continue;
names[sym.name] = true;
var arg = iife.args[i]; var arg = iife.args[i];
if (!arg) arg = make_node(AST_Undefined, sym); if (!arg) arg = make_node(AST_Undefined, sym);
else { else {
@@ -840,11 +844,11 @@ merge(Compressor.prototype, {
}); });
arg.walk(tw); arg.walk(tw);
} }
if (arg) candidates.push(make_node(AST_VarDef, sym, { if (arg) candidates.unshift(make_node(AST_VarDef, sym, {
name: sym, name: sym,
value: arg value: arg
})); }));
}); }
} }
} }

View File

@@ -2320,3 +2320,25 @@ issue_2203_2: {
} }
expect_stdout: "PASS" expect_stdout: "PASS"
} }
duplicate_argname: {
options = {
collapse_vars: true,
unused: true,
}
input: {
function f() { return "PASS"; }
console.log(function(a, a) {
f++;
return a;
}("FAIL", f()));
}
expect: {
function f() { return "PASS"; }
console.log(function(a, a) {
f++;
return a;
}("FAIL", f()));
}
expect_stdout: "PASS"
}