diff options
-rw-r--r-- | lib/compress.js | 33 | ||||
-rw-r--r-- | test/compress/default-values.js | 83 |
2 files changed, 109 insertions, 7 deletions
diff --git a/lib/compress.js b/lib/compress.js index ca2880ec..aedbe448 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -8055,6 +8055,7 @@ merge(Compressor.prototype, { var stat = is_func && fn.first_statement(); var has_default = false; var can_drop = is_func && all(fn.argnames, function(argname, index) { + if (has_default && self.args[index] instanceof AST_Spread) return false; if (argname instanceof AST_DefaultValue) { has_default = true; var arg = self.args[index]; @@ -8062,7 +8063,7 @@ merge(Compressor.prototype, { var abort = false; argname.value.walk(new TreeWalker(function(node) { if (abort) return true; - if (node instanceof AST_SymbolRef && fn.find_variable(node.name) === node.definition()) { + if (node instanceof AST_SymbolRef && fn.variables.get(node.name) === node.definition()) { return abort = true; } })); @@ -8407,29 +8408,47 @@ merge(Compressor.prototype, { for (var i = self.args.length; --i >= len;) { expressions.push(self.args[i]); } + var default_args = []; for (i = len; --i >= 0;) { - var name = fn.argnames[i]; - var value = self.args[i]; - if (name instanceof AST_DefaultValue) { - value = value ? make_sequence(self, [ value, name.value ]) : name.value; - name = name.name; + var argname = fn.argnames[i]; + var name; + if (argname instanceof AST_DefaultValue) { + default_args.push(argname); + name = argname.name; + } else { + name = argname; } + var value = self.args[i]; if (name.__unused || scope.var_names()[name.name]) { if (value) expressions.push(value); } else { var symbol = make_node(AST_SymbolVar, name, name); name.definition().orig.push(symbol); - if (!value && in_loop) value = make_node(AST_Undefined, self); if ("__unused" in name) { append_var(decls, expressions, symbol); if (value) expressions.push(value); } else { + if (!value && in_loop && argname === name) value = make_node(AST_Undefined, self); append_var(decls, expressions, symbol, value); } } } decls.reverse(); expressions.reverse(); + for (i = default_args.length; --i >= 0;) { + var node = default_args[i]; + if ("__unused" in node.name) { + expressions.push(node.value); + } else { + var sym = make_node(AST_SymbolRef, node.name, node.name); + node.name.definition().references.push(sym); + expressions.push(make_node(AST_Assign, node, { + operator: "=", + left: sym, + right: node.value, + })); + } + } } function flatten_vars(decls, expressions) { diff --git a/test/compress/default-values.js b/test/compress/default-values.js index cefffc58..7308b303 100644 --- a/test/compress/default-values.js +++ b/test/compress/default-values.js @@ -1341,3 +1341,86 @@ issue_4496: { ] node_version: ">=6" } + +issue_4502_1: { + options = { + inline: true, + unused: true, + } + input: { + (function() { + var a = "PASS"; + (function(b = a++) { + var a; + })(void 0, console.log(a)); + })(); + } + expect: { + (function() { + var a = "PASS"; + console.log(a), + a++, + void 0; + })(); + } + expect_stdout: "PASS" + node_version: ">=6" +} + +issue_4502_2: { + options = { + inline: true, + unused: true, + } + input: { + (function() { + var a = "PASS"; + (function(b = a++) {})(void 0, console.log(a)); + })(); + } + expect: { + (function() { + var a = "PASS"; + console.log(a), + a++, + void 0; + })(); + } + expect_stdout: "PASS" + node_version: ">=6" +} + +issue_4502_3: { + options = { + side_effects: true, + } + input: { + (function() { + var a = "PASS"; + (function(b = a++) {})(void 0, console.log(a)); + })(); + } + expect: { + (function() { + var a = "PASS"; + console.log(a), + a++; + })(); + } + expect_stdout: "PASS" + node_version: ">=6" +} + +issue_4502_4: { + options = { + side_effects: true, + } + input: { + (function(a, b = console.log("FAIL")) {})(..."" + console.log(42)); + } + expect: { + (function(a, b = console.log("FAIL")) {})(..."" + console.log(42)); + } + expect_stdout: "42" + node_version: ">=6" +} |