enhance reduce_vars (#4088)
This commit is contained in:
@@ -325,22 +325,22 @@ merge(Compressor.prototype, {
|
|||||||
}
|
}
|
||||||
var lhs = is_lhs(node, parent);
|
var lhs = is_lhs(node, parent);
|
||||||
if (lhs) return lhs;
|
if (lhs) return lhs;
|
||||||
if (!immutable
|
if (parent instanceof AST_Array) return is_modified(compressor, tw, parent, parent, level + 1);
|
||||||
&& parent instanceof AST_Call
|
if (parent instanceof AST_Call) {
|
||||||
&& parent.expression === node
|
return !immutable
|
||||||
&& !parent.is_expr_pure(compressor)
|
&& parent.expression === node
|
||||||
&& (!(value instanceof AST_Function)
|
&& !parent.is_expr_pure(compressor)
|
||||||
|| !(parent instanceof AST_New) && value.contains_this())) {
|
&& (!(value instanceof AST_Function)
|
||||||
return true;
|
|| !(parent instanceof AST_New) && value.contains_this());
|
||||||
}
|
}
|
||||||
if (parent instanceof AST_Array) {
|
if (parent instanceof AST_ForIn) return parent.init === node;
|
||||||
return is_modified(compressor, tw, parent, parent, level + 1);
|
if (parent instanceof AST_ObjectKeyVal) {
|
||||||
}
|
if (parent.value !== node) return;
|
||||||
if (parent instanceof AST_ObjectKeyVal && node === parent.value) {
|
|
||||||
var obj = tw.parent(level + 1);
|
var obj = tw.parent(level + 1);
|
||||||
return is_modified(compressor, tw, obj, obj, level + 2);
|
return is_modified(compressor, tw, obj, obj, level + 2);
|
||||||
}
|
}
|
||||||
if (parent instanceof AST_PropAccess && parent.expression === node) {
|
if (parent instanceof AST_PropAccess) {
|
||||||
|
if (parent.expression !== node) return;
|
||||||
var prop = read_property(value, parent);
|
var prop = read_property(value, parent);
|
||||||
return (!immutable || recursive) && is_modified(compressor, tw, parent, prop, level + 1);
|
return (!immutable || recursive) && is_modified(compressor, tw, parent, prop, level + 1);
|
||||||
}
|
}
|
||||||
@@ -514,33 +514,41 @@ merge(Compressor.prototype, {
|
|||||||
|| value instanceof AST_This;
|
|| value instanceof AST_This;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function has_escaped(d, node, parent) {
|
||||||
|
if (parent instanceof AST_Assign) return parent.operator == "=" && parent.right === node;
|
||||||
|
if (parent instanceof AST_Call) return parent.expression !== node || parent instanceof AST_New;
|
||||||
|
if (parent instanceof AST_Exit) return parent.value === node && node.scope !== d.scope;
|
||||||
|
if (parent instanceof AST_VarDef) return parent.value === node;
|
||||||
|
}
|
||||||
|
|
||||||
|
function value_in_use(node, parent) {
|
||||||
|
if (parent instanceof AST_Array) return true;
|
||||||
|
if (parent instanceof AST_Binary) return lazy_op[parent.operator];
|
||||||
|
if (parent instanceof AST_Conditional) return parent.condition !== node;
|
||||||
|
if (parent instanceof AST_Sequence) return parent.tail_node() === node;
|
||||||
|
}
|
||||||
|
|
||||||
function mark_escaped(tw, d, scope, node, value, level, depth) {
|
function mark_escaped(tw, d, scope, node, value, level, depth) {
|
||||||
var parent = tw.parent(level);
|
var parent = tw.parent(level);
|
||||||
if (value && value.is_constant()) return;
|
if (value && value.is_constant()) return;
|
||||||
if (parent instanceof AST_Assign && parent.operator == "=" && node === parent.right
|
if (has_escaped(d, node, parent)) {
|
||||||
|| parent instanceof AST_Call && (node !== parent.expression || parent instanceof AST_New)
|
|
||||||
|| parent instanceof AST_Exit && node === parent.value && node.scope !== d.scope
|
|
||||||
|| parent instanceof AST_VarDef && node === parent.value) {
|
|
||||||
d.escaped.push(parent);
|
d.escaped.push(parent);
|
||||||
if (depth > 1 && !(value && value.is_constant_expression(scope))) depth = 1;
|
if (depth > 1 && !(value && value.is_constant_expression(scope))) depth = 1;
|
||||||
if (!d.escaped.depth || d.escaped.depth > depth) d.escaped.depth = depth;
|
if (!d.escaped.depth || d.escaped.depth > depth) d.escaped.depth = depth;
|
||||||
return;
|
return;
|
||||||
} else if (parent instanceof AST_Array
|
} else if (value_in_use(node, parent)) {
|
||||||
|| parent instanceof AST_Binary && lazy_op[parent.operator]
|
|
||||||
|| parent instanceof AST_Conditional && node !== parent.condition
|
|
||||||
|| parent instanceof AST_Sequence && node === parent.tail_node()) {
|
|
||||||
mark_escaped(tw, d, scope, parent, parent, level + 1, depth);
|
mark_escaped(tw, d, scope, parent, parent, level + 1, depth);
|
||||||
} else if (parent instanceof AST_ObjectKeyVal && node === parent.value) {
|
} else if (parent instanceof AST_ObjectKeyVal && parent.value === node) {
|
||||||
var obj = tw.parent(level + 1);
|
var obj = tw.parent(level + 1);
|
||||||
mark_escaped(tw, d, scope, obj, obj, level + 2, depth);
|
mark_escaped(tw, d, scope, obj, obj, level + 2, depth);
|
||||||
} else if (parent instanceof AST_PropAccess && node === parent.expression) {
|
} else if (parent instanceof AST_PropAccess && parent.expression === node) {
|
||||||
value = read_property(value, parent);
|
value = read_property(value, parent);
|
||||||
mark_escaped(tw, d, scope, parent, value, level + 1, depth + 1);
|
mark_escaped(tw, d, scope, parent, value, level + 1, depth + 1);
|
||||||
if (value) return;
|
if (value) return;
|
||||||
}
|
}
|
||||||
if (level > 0) return;
|
if (level > 0) return;
|
||||||
if (parent instanceof AST_Call && node === parent.expression) return;
|
if (parent instanceof AST_Call && parent.expression === node) return;
|
||||||
if (parent instanceof AST_Sequence && node !== parent.tail_node()) return;
|
if (parent instanceof AST_Sequence && parent.tail_node() !== node) return;
|
||||||
if (parent instanceof AST_SimpleStatement) return;
|
if (parent instanceof AST_SimpleStatement) return;
|
||||||
if (parent instanceof AST_Unary && !unary_side_effects[parent.operator]) return;
|
if (parent instanceof AST_Unary && !unary_side_effects[parent.operator]) return;
|
||||||
d.direct_access = true;
|
d.direct_access = true;
|
||||||
@@ -739,13 +747,11 @@ merge(Compressor.prototype, {
|
|||||||
push(tw);
|
push(tw);
|
||||||
var init = this.init;
|
var init = this.init;
|
||||||
init.walk(tw);
|
init.walk(tw);
|
||||||
if (init instanceof AST_Var) {
|
if (init instanceof AST_SymbolRef) {
|
||||||
init = init.definitions[0].name;
|
init.definition().fixed = false;
|
||||||
} else while (init instanceof AST_PropAccess) {
|
} else if (init instanceof AST_Var) {
|
||||||
init = init.expression.tail_node();
|
init.definitions[0].name.definition().fixed = false;
|
||||||
}
|
}
|
||||||
var def = init.definition();
|
|
||||||
if (def) def.fixed = false;
|
|
||||||
this.body.walk(tw);
|
this.body.walk(tw);
|
||||||
pop(tw);
|
pop(tw);
|
||||||
tw.in_loop = saved_loop;
|
tw.in_loop = saved_loop;
|
||||||
|
|||||||
Reference in New Issue
Block a user