enhance collapse_vars around lazy operations (#2369)
This commit is contained in:
@@ -778,6 +778,7 @@ merge(Compressor.prototype, {
|
|||||||
// Locate symbols which may execute code outside of scanning range
|
// Locate symbols which may execute code outside of scanning range
|
||||||
var lvalues = get_lvalues(candidate);
|
var lvalues = get_lvalues(candidate);
|
||||||
if (lhs instanceof AST_SymbolRef) lvalues[lhs.name] = false;
|
if (lhs instanceof AST_SymbolRef) lvalues[lhs.name] = false;
|
||||||
|
var one_off = lhs instanceof AST_Symbol && lhs.definition().references.length == 1;
|
||||||
var side_effects = value_has_side_effects(candidate);
|
var side_effects = value_has_side_effects(candidate);
|
||||||
var hit = candidate.name instanceof AST_SymbolFunarg;
|
var hit = candidate.name instanceof AST_SymbolFunarg;
|
||||||
var abort = false, replaced = false;
|
var abort = false, replaced = false;
|
||||||
@@ -844,11 +845,11 @@ merge(Compressor.prototype, {
|
|||||||
|| side_effects && !references_in_scope(node.definition()))
|
|| side_effects && !references_in_scope(node.definition()))
|
||||||
|| (sym = lhs_or_def(node))
|
|| (sym = lhs_or_def(node))
|
||||||
&& (sym instanceof AST_PropAccess || sym.name in lvalues)
|
&& (sym instanceof AST_PropAccess || sym.name in lvalues)
|
||||||
|| parent instanceof AST_Binary && lazy_op(parent.operator)
|
|| (side_effects || !one_off)
|
||||||
|
&& (parent instanceof AST_Binary && lazy_op(parent.operator)
|
||||||
|| parent instanceof AST_Case
|
|| parent instanceof AST_Case
|
||||||
|| parent instanceof AST_Conditional
|
|| parent instanceof AST_Conditional
|
||||||
|| parent instanceof AST_For
|
|| parent instanceof AST_If)) {
|
||||||
|| parent instanceof AST_If) {
|
|
||||||
if (!(node instanceof AST_Scope)) descend(node, tt);
|
if (!(node instanceof AST_Scope)) descend(node, tt);
|
||||||
abort = true;
|
abort = true;
|
||||||
return node;
|
return node;
|
||||||
|
|||||||
@@ -2951,3 +2951,68 @@ issue_2364_9: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
expect_stdout: "PASS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pure_getters_chain: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
pure_getters: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function o(t, r) {
|
||||||
|
var a = t[1], s = t[2], o = t[3], i = t[5];
|
||||||
|
return a <= 23 && s <= 59 && o <= 59 && (!r || i);
|
||||||
|
}
|
||||||
|
console.log(o([ , 23, 59, 59, , 42], 1));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function o(t, r) {
|
||||||
|
return t[1] <= 23 && t[2] <= 59 && t[3] <= 59 && (!r || t[5]);
|
||||||
|
}
|
||||||
|
console.log(o([ , 23, 59, 59, , 42], 1));
|
||||||
|
}
|
||||||
|
expect_stdout: "42"
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
var c = "";
|
||||||
|
var d = b ? ">" : "<";
|
||||||
|
if (a) c += "=";
|
||||||
|
return c += d;
|
||||||
|
}
|
||||||
|
console.log(f(0, 0), f(0, 1), f(1, 0), f(1, 1));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
var c = "";
|
||||||
|
if (a) c += "=";
|
||||||
|
return c += b ? ">" : "<";
|
||||||
|
}
|
||||||
|
console.log(f(0, 0), f(0, 1), f(1, 0), f(1, 1));
|
||||||
|
}
|
||||||
|
expect_stdout: "< > =< =>"
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
var c = a + 1, d = a + 2;
|
||||||
|
return b ? c : d;
|
||||||
|
}
|
||||||
|
console.log(f(3, 0), f(4, 1));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
return b ? a + 1 : a + 2;
|
||||||
|
}
|
||||||
|
console.log(f(3, 0), f(4, 1));
|
||||||
|
}
|
||||||
|
expect_stdout: "5 5"
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user