consolidate single-use function reduction (#2427)

fixes #2423
This commit is contained in:
Alex Lam S.L
2017-11-05 04:27:01 +08:00
committed by GitHub
parent fe5a68f9d5
commit a8aa28a7a6
2 changed files with 91 additions and 11 deletions

View File

@@ -315,12 +315,18 @@ merge(Compressor.prototype, {
d.fixed = false;
} else if (d.fixed) {
var value = node.fixed_value();
if (unused) {
d.single_use = value
&& d.references.length == 1
&& loop_ids[d.id] === in_loop
&& d.scope === node.scope
&& value.is_constant_expression();
if (unused && value && d.references.length == 1) {
if (value instanceof AST_Lambda) {
d.single_use = d.scope === node.scope
&& !(d.orig[0] instanceof AST_SymbolFunarg)
|| value.is_constant_expression();
} else {
d.single_use = d.scope === node.scope
&& loop_ids[d.id] === in_loop
&& value.is_constant_expression();
}
} else {
d.single_use = false;
}
if (is_modified(node, value, 0, is_immutable(value))) {
if (d.single_use) {
@@ -377,6 +383,10 @@ merge(Compressor.prototype, {
} else {
d.fixed = node;
mark(d, true);
if (unused && d.references.length == 1) {
d.single_use = d.scope === d.references[0].scope
|| node.is_constant_expression();
}
}
var save_ids = safe_ids;
safe_ids = Object.create(null);
@@ -527,6 +537,7 @@ merge(Compressor.prototype, {
}
return true;
}
return def.fixed instanceof AST_Defun;
}
function safe_to_assign(def, value) {
@@ -2165,7 +2176,7 @@ merge(Compressor.prototype, {
}
def(AST_Node, return_false);
def(AST_Constant, return_true);
def(AST_Function, function(){
def(AST_Lambda, function(){
var self = this;
var result = true;
self.walk(new TreeWalker(function(node) {
@@ -4221,10 +4232,7 @@ merge(Compressor.prototype, {
if (compressor.option("unused")
&& fixed
&& d.references.length == 1
&& (d.single_use || fixed instanceof AST_Function
&& !(d.scope.uses_arguments && d.orig[0] instanceof AST_SymbolFunarg)
&& !d.scope.uses_eval
&& compressor.find_parent(AST_Scope) === fixed.parent_scope)) {
&& d.single_use) {
var value = fixed.optimize(compressor);
return value === fixed ? fixed.clone(true) : value;
}

View File

@@ -3379,3 +3379,75 @@ issue_2420_2: {
"false false true",
]
}
issue_2423_1: {
options = {
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
function c() { return 1; }
function p() { console.log(c()); }
p();
p();
}
expect: {
function p() { console.log(function() { return 1; }()); }
p();
p();
}
}
issue_2423_2: {
options = {
inline: true,
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
function c() { return 1; }
function p() { console.log(c()); }
p();
p();
}
expect: {
function p() { console.log(1); }
p();
p();
}
}
issue_2423_3: {
options = {
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
function c() { return 1; }
function p() { console.log(c()); }
p();
}
expect: {
(function() { console.log(function() { return 1; }()); })();
}
}
issue_2423_4: {
options = {
inline: true,
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
function c() { return 1; }
function p() { console.log(c()); }
p();
}
expect: {
void console.log(1);
}
}