fix AST_PropAccess in collapse_vars (take 3) (#2375)

Suppress scanning beyond assignment to `a.b`
This commit is contained in:
Alex Lam S.L
2017-10-18 02:54:51 +08:00
committed by GitHub
parent c1346e06b7
commit 7e5b5cac97
2 changed files with 175 additions and 21 deletions

View File

@@ -838,11 +838,12 @@ merge(Compressor.prototype, {
if (node instanceof AST_Call
|| node instanceof AST_Exit
|| node instanceof AST_PropAccess
&& (side_effects || node.has_side_effects(compressor))
&& (side_effects || node.expression.may_throw_on_access(compressor))
|| node instanceof AST_SymbolRef
&& (lvalues[node.name]
|| side_effects && !references_in_scope(node.definition()))
|| (sym = lhs_or_def(node)) && get_symbol(sym).name in lvalues
|| (sym = lhs_or_def(node))
&& (sym instanceof AST_PropAccess || sym.name in lvalues)
|| parent instanceof AST_Binary && lazy_op(parent.operator)
|| parent instanceof AST_Case
|| parent instanceof AST_Conditional
@@ -933,29 +934,14 @@ merge(Compressor.prototype, {
}
}
function get_symbol(node) {
while (node instanceof AST_PropAccess) node = node.expression;
return node;
}
function get_lvalues(expr) {
var lvalues = Object.create(null);
if (expr instanceof AST_Unary) return lvalues;
var scope;
var tw = new TreeWalker(function(node, descend) {
if (node instanceof AST_Scope) {
var save_scope = scope;
descend();
scope = save_scope;
return true;
}
if (node instanceof AST_PropAccess
|| node instanceof AST_SymbolRef
|| node instanceof AST_This) {
var sym = get_symbol(node);
if (sym instanceof AST_SymbolRef || node instanceof AST_This) {
lvalues[sym.name] = lvalues[sym.name] || is_lhs(node, tw.parent());
}
var sym = node;
while (sym instanceof AST_PropAccess) sym = sym.expression;
if (sym instanceof AST_SymbolRef || sym instanceof AST_This) {
lvalues[sym.name] = lvalues[sym.name] || is_lhs(node, tw.parent());
}
});
expr[expr instanceof AST_Assign ? "right" : "value"].walk(tw);