fix variable accounting in inline (#2085)

fixes #2084
This commit is contained in:
Alex Lam S.L
2017-06-13 01:40:14 +08:00
committed by GitHub
parent 5ef7cb372a
commit 2bdc8802dd
3 changed files with 67 additions and 20 deletions

View File

@@ -3171,16 +3171,16 @@ merge(Compressor.prototype, {
&& !exp.uses_arguments
&& !exp.uses_eval
&& !self.has_pure_annotation(compressor)) {
var body;
var value;
if (stat instanceof AST_Return) {
body = stat.value.clone(true);
value = stat.value.clone(true);
} else if (stat instanceof AST_SimpleStatement) {
body = [];
merge_sequence(body, stat.body.clone(true));
merge_sequence(body, make_node(AST_Undefined, self));
body = make_sequence(self, body);
value = make_node(AST_UnaryPrefix, stat, {
operator: "void",
expression: stat.body.clone(true)
});
}
if (body) {
if (value) {
var fn = exp.clone();
fn.argnames = [];
fn.body = [];
@@ -3200,17 +3200,25 @@ merge(Compressor.prototype, {
}));
}
fn.body.push(make_node(AST_Return, self, {
value: body
value: value
}));
body = fn.transform(compressor).body;
var body = fn.transform(compressor).body;
if (body.length == 0) return make_node(AST_Undefined, self);
if (body.length == 1 && body[0] instanceof AST_Return) {
if (!body[0].value) return make_node(AST_Undefined, self);
body = best_of(compressor, body[0].value, self);
value = body[0].value;
if (!value) return make_node(AST_Undefined, self);
value.walk(new TreeWalker(function(node) {
if (value === self) return true;
if (node instanceof AST_SymbolRef && exp.variables.has(node.name)) {
value = self;
return true;
}
}));
if (value !== self) value = best_of(compressor, value, self);
} else {
body = self;
value = self;
}
if (body !== self) return body;
if (value !== self) return value;
}
}
if (compressor.option("side_effects") && all(exp.body, is_empty)) {