diff --git a/lib/compress.js b/lib/compress.js index 0433dd6ae9..2c1757b624 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -8427,16 +8427,19 @@ merge(Compressor.prototype, { if (!all(args, function(arg) { return !(arg instanceof AST_Spread); })) return; + var argnames = fn.argnames; var is_iife = fn === exp && !fn.name; if (fn.rest) { if (!(is_iife && compressor.option("rests"))) return; - var insert = fn.argnames.length; + var insert = argnames.length; args = args.slice(0, insert); while (args.length < insert) args.push(make_node(AST_Undefined, call).optimize(compressor)); args.push(make_node(AST_Array, call, { elements: call.args.slice(insert) })); - call.args = args; - fn.argnames = fn.argnames.concat(fn.rest); + argnames = argnames.concat(fn.rest); fn.rest = null; + } else { + args = args.slice(); + argnames = argnames.slice(); } var pos = 0, last = 0; var drop_defaults = is_iife && compressor.option("default_values"); @@ -8452,14 +8455,14 @@ merge(Compressor.prototype, { } : return_false; var side_effects = []; for (var i = 0; i < args.length; i++) { - var argname = fn.argnames[i]; + var argname = argnames[i]; if (drop_defaults && argname instanceof AST_DefaultValue && args[i].is_defined(compressor)) { - fn.argnames[i] = argname = argname.name; + argnames[i] = argname = argname.name; } if (!argname || "__unused" in argname) { var node = args[i].drop_side_effect_free(compressor); if (drop_fargs(argname)) { - if (argname) fn.argnames.splice(i, 1); + if (argname) argnames.splice(i, 1); args.splice(i, 1); if (node) side_effects.push(node); i--; @@ -8481,7 +8484,7 @@ merge(Compressor.prototype, { } } else if (drop_fargs(argname, args[i])) { var node = args[i].drop_side_effect_free(compressor); - fn.argnames.splice(i, 1); + argnames.splice(i, 1); args.splice(i, 1); if (node) side_effects.push(node); i--; @@ -8493,15 +8496,17 @@ merge(Compressor.prototype, { } last = pos; } - for (; i < fn.argnames.length; i++) { - if (drop_fargs(fn.argnames[i])) fn.argnames.splice(i--, 1); + for (; i < argnames.length; i++) { + if (drop_fargs(argnames[i])) argnames.splice(i--, 1); } + fn.argnames = argnames; args.length = last; + call.args = args; if (!side_effects.length) return; var arg = make_sequence(call, side_effects); - args.push(args.length < fn.argnames.length ? make_node(AST_UnaryPrefix, call, { + args.push(args.length < argnames.length ? make_node(AST_UnaryPrefix, call, { operator: "void", - expression: arg + expression: arg, }) : arg); } diff --git a/test/compress/drop-unused.js b/test/compress/drop-unused.js index dd7f290da2..4ade08631f 100644 --- a/test/compress/drop-unused.js +++ b/test/compress/drop-unused.js @@ -3357,3 +3357,34 @@ issue_4806_3: { } expect_stdout: "PASS" } + +issue_4834: { + options = { + inline: true, + keep_fargs: false, + pure_getters: "strict", + reduce_vars: true, + side_effects: true, + toplevel: true, + unused: true, + } + input: { + try { + new function(a, b) { + b; + b.p; + }(42); + } catch (e) { + console.log("PASS"); + } + } + expect: { + try { + void b.p; + } catch (e) { + console.log("PASS"); + } + var b; + } + expect_stdout: "PASS" +}