simplify scan
This commit is contained in:
parent
eb570c4661
commit
1d24488655
|
|
@ -673,6 +673,7 @@ merge(Compressor.prototype, {
|
||||||
var lhs = get_lhs(candidate);
|
var lhs = get_lhs(candidate);
|
||||||
if (!lhs || is_lhs_read_only(lhs)) continue;
|
if (!lhs || is_lhs_read_only(lhs)) continue;
|
||||||
var lvalues = get_lvalues(candidate);
|
var lvalues = get_lvalues(candidate);
|
||||||
|
if (lhs instanceof AST_SymbolRef) lvalues[lhs.name] = false;
|
||||||
var side_effects = value_has_side_effects(candidate);
|
var side_effects = value_has_side_effects(candidate);
|
||||||
var hit = false, abort = false, replaced = false;
|
var hit = false, abort = false, replaced = false;
|
||||||
var tt = new TreeTransformer(function(node, descend) {
|
var tt = new TreeTransformer(function(node, descend) {
|
||||||
|
|
@ -697,10 +698,10 @@ merge(Compressor.prototype, {
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
// Replace variable with assignment when found
|
// Replace variable with assignment when found
|
||||||
if (lhs.equivalent_to(node)) {
|
if (!(node instanceof AST_SymbolDeclaration)
|
||||||
abort = true;
|
&& !is_lhs(node, parent)
|
||||||
if (is_lhs(node, parent)) return node;
|
&& lhs.equivalent_to(node)) {
|
||||||
CHANGED = replaced = true;
|
CHANGED = replaced = abort = true;
|
||||||
compressor.info("Collapsing {name} [{file}:{line},{col}]", {
|
compressor.info("Collapsing {name} [{file}:{line},{col}]", {
|
||||||
name: node.print_to_string(),
|
name: node.print_to_string(),
|
||||||
file: node.start.file,
|
file: node.start.file,
|
||||||
|
|
@ -723,24 +724,6 @@ merge(Compressor.prototype, {
|
||||||
}
|
}
|
||||||
return candidate;
|
return candidate;
|
||||||
}
|
}
|
||||||
if (lhs instanceof AST_SymbolRef) {
|
|
||||||
// `a = x; a = a + y;` => `a = x + y;`
|
|
||||||
if (node instanceof AST_Assign
|
|
||||||
&& node.operator == "="
|
|
||||||
&& lhs.equivalent_to(node.left)) {
|
|
||||||
node.right = node.right.transform(tt);
|
|
||||||
abort = true;
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
// `var a = x, a = a + y;` => `var a = x + y;`
|
|
||||||
if (node instanceof AST_VarDef
|
|
||||||
&& node.value
|
|
||||||
&& node.name.definition() === lhs.definition()) {
|
|
||||||
node.value = node.value.transform(tt);
|
|
||||||
abort = true;
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// These node types have child nodes that execute sequentially,
|
// These node types have child nodes that execute sequentially,
|
||||||
// but are otherwise not safe to scan into or beyond them.
|
// but are otherwise not safe to scan into or beyond them.
|
||||||
var sym;
|
var sym;
|
||||||
|
|
@ -748,9 +731,9 @@ merge(Compressor.prototype, {
|
||||||
|| node instanceof AST_Exit
|
|| node instanceof AST_Exit
|
||||||
|| node instanceof AST_PropAccess
|
|| node instanceof AST_PropAccess
|
||||||
|| node instanceof AST_SymbolRef
|
|| node instanceof AST_SymbolRef
|
||||||
&& (lvalues && lvalues[node.name]
|
&& (lvalues[node.name]
|
||||||
|| side_effects && !references_in_scope(node.definition()))
|
|| side_effects && !references_in_scope(node.definition()))
|
||||||
|| lvalues && (sym = lhs_or_def(node)) && get_symbol(sym).name in lvalues
|
|| (sym = lhs_or_def(node)) && get_symbol(sym).name in lvalues
|
||||||
|| parent instanceof AST_Binary
|
|| parent instanceof AST_Binary
|
||||||
&& (parent.operator == "&&" || parent.operator == "||")
|
&& (parent.operator == "&&" || parent.operator == "||")
|
||||||
|| parent instanceof AST_Case
|
|| parent instanceof AST_Case
|
||||||
|
|
@ -807,8 +790,9 @@ merge(Compressor.prototype, {
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_lvalues(expr) {
|
function get_lvalues(expr) {
|
||||||
if (expr instanceof AST_Unary) return;
|
var lvalues = Object.create(null);
|
||||||
var lvalues, scope;
|
if (expr instanceof AST_Unary) return lvalues;
|
||||||
|
var scope;
|
||||||
var tw = new TreeWalker(function(node, descend) {
|
var tw = new TreeWalker(function(node, descend) {
|
||||||
if (node instanceof AST_Scope) {
|
if (node instanceof AST_Scope) {
|
||||||
var save_scope = scope;
|
var save_scope = scope;
|
||||||
|
|
@ -819,7 +803,6 @@ merge(Compressor.prototype, {
|
||||||
if (node instanceof AST_SymbolRef || node instanceof AST_PropAccess) {
|
if (node instanceof AST_SymbolRef || node instanceof AST_PropAccess) {
|
||||||
var sym = get_symbol(node);
|
var sym = get_symbol(node);
|
||||||
if (sym instanceof AST_SymbolRef) {
|
if (sym instanceof AST_SymbolRef) {
|
||||||
if (!lvalues) lvalues = Object.create(null);
|
|
||||||
lvalues[sym.name] = lvalues[sym.name] || is_lhs(node, tw.parent());
|
lvalues[sym.name] = lvalues[sym.name] || is_lhs(node, tw.parent());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user