diff options
-rw-r--r-- | lib/compress.js | 29 | ||||
-rw-r--r-- | test/compress/rests.js | 49 |
2 files changed, 66 insertions, 12 deletions
diff --git a/lib/compress.js b/lib/compress.js index 1eed09ba..38d25b15 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -4368,6 +4368,7 @@ merge(Compressor.prototype, { } return !(sym instanceof AST_Destructured); })) return this; + if (fn.rest instanceof AST_Destructured) return this; if (!args && !ignore_side_effects) return this; var stat = fn.first_statement(); if (!(stat instanceof AST_Return)) { @@ -4394,18 +4395,8 @@ merge(Compressor.prototype, { if (!val) return; var cached_args = []; if (!args || all(fn.argnames, function(sym, i) { - if (sym instanceof AST_DefaultValue) sym = sym.name; - var def = sym.definition(); - if (def.orig[def.orig.length - 1] !== sym) return false; - var value = args[i]; - def.references.forEach(function(node) { - node._eval = function() { - return value; - }; - cached_args.push(node); - }); - return true; - }) || ignore_side_effects) { + return assign(sym, args[i]); + }) && !(fn.rest && !assign(fn.rest, args.slice(fn.argnames.length))) || ignore_side_effects) { fn.evaluating = true; val = val._eval(compressor, ignore_side_effects, cached, depth); delete fn.evaluating; @@ -4450,6 +4441,20 @@ merge(Compressor.prototype, { } } return this; + + function assign(sym, arg) { + if (sym instanceof AST_DefaultValue) sym = sym.name; + var def = sym.definition(); + if (def.orig[def.orig.length - 1] !== sym) return false; + var value = arg; + def.references.forEach(function(node) { + node._eval = function() { + return value; + }; + cached_args.push(node); + }); + return true; + } }); def(AST_New, return_this); def(AST_Template, function(compressor, ignore_side_effects, cached, depth) { diff --git a/test/compress/rests.js b/test/compress/rests.js index 21adf204..59e29457 100644 --- a/test/compress/rests.js +++ b/test/compress/rests.js @@ -714,3 +714,52 @@ issue_4621: { expect_stdout: "PASS" node_version: ">=6" } + +issue_4644_1: { + options = { + evaluate: true, + } + input: { + var a = "FAIL"; + (function f(b, ...{ + [a = "PASS"]: c, + }) { + return b; + })(); + console.log(a); + } + expect: { + var a = "FAIL"; + (function f(b, ...{ + [a = "PASS"]: c, + }) { + return b; + })(); + console.log(a); + } + expect_stdout: "PASS" + node_version: ">=6" +} + +issue_4644_2: { + options = { + evaluate: true, + unsafe: true, + } + input: { + console.log(function(...a) { + return a[1]; + }("FAIL", "PASS"), function(...b) { + return b.length; + }(), function(c, ...d) { + return d[0]; + }("FAIL")); + } + expect: { + console.log("PASS", 0, function(c, ...d) { + return d[0]; + }("FAIL")); + } + expect_stdout: "PASS 0 undefined" + node_version: ">=6" +} |