aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/compress.js29
-rw-r--r--test/compress/rests.js49
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"
+}