enhance collapse_vars (#4885)

This commit is contained in:
Alex Lam S.L
2021-05-01 14:37:52 +01:00
committed by GitHub
parent 8bbfaacdae
commit 16411dcb87
3 changed files with 41 additions and 33 deletions

View File

@@ -1902,6 +1902,7 @@ merge(Compressor.prototype, {
hit_stack = candidates.pop(); hit_stack = candidates.pop();
var hit_index = 0; var hit_index = 0;
var candidate = hit_stack[hit_stack.length - 1]; var candidate = hit_stack[hit_stack.length - 1];
var remaining;
var value_def = null; var value_def = null;
var stop_after = null; var stop_after = null;
var stop_if_hit = null; var stop_if_hit = null;
@@ -1944,25 +1945,22 @@ merge(Compressor.prototype, {
statements[i].transform(scanner); statements[i].transform(scanner);
} }
if (value_def) { if (value_def) {
var def = lhs.definition(); if (!replaced || remaining > replaced) {
var referenced = def.references.length - def.replaced;
if (candidate instanceof AST_Assign) referenced--;
if (!replaced || referenced > replaced) {
candidates.push(hit_stack); candidates.push(hit_stack);
force_single = true; force_single = true;
continue; continue;
} }
var def = lhs.definition();
abort = false; abort = false;
hit_index = 0; hit_index = 0;
hit = funarg; hit = funarg;
for (var i = stat_index; !abort && i < statements.length; i++) { for (var i = stat_index; !abort && i < statements.length; i++) {
if (!statements[i].transform(multi_replacer)) statements.splice(i--, 1); if (!statements[i].transform(multi_replacer)) statements.splice(i--, 1);
} }
if (candidate !== hit_stack[hit_stack.length - 1]) { replaced = candidate instanceof AST_VarDef
replaced = false; && candidate === hit_stack[hit_stack.length - 1]
} else if (candidate instanceof AST_VarDef) { && def.references.length == def.replaced
replaced = !compressor.exposed(def) && def.references.length == def.replaced; && !compressor.exposed(def);
}
value_def.last_ref = false; value_def.last_ref = false;
value_def.single_use = false; value_def.single_use = false;
} }
@@ -2252,7 +2250,7 @@ merge(Compressor.prototype, {
if (!arg) continue; if (!arg) continue;
var candidate = make_node(AST_VarDef, sym, { var candidate = make_node(AST_VarDef, sym, {
name: sym, name: sym,
value: arg value: arg,
}); });
candidate.name_index = i; candidate.name_index = i;
candidate.arg_index = value ? len + i : i; candidate.arg_index = value ? len + i : i;
@@ -2268,12 +2266,11 @@ merge(Compressor.prototype, {
extract_candidates(node, unused); extract_candidates(node, unused);
}); });
} else if (expr instanceof AST_Assign) { } else if (expr instanceof AST_Assign) {
if (!(expr.left instanceof AST_Destructured)) candidates.push(hit_stack.slice()); var lhs = expr.left;
extract_candidates(expr.left); if (!(lhs instanceof AST_Destructured)) candidates.push(hit_stack.slice());
extract_candidates(lhs);
extract_candidates(expr.right); extract_candidates(expr.right);
if (expr.left instanceof AST_SymbolRef) { if (lhs instanceof AST_SymbolRef) assignments[lhs.name] = (assignments[lhs.name] || 0) + 1;
assignments[expr.left.name] = (assignments[expr.left.name] || 0) + 1;
}
} else if (expr instanceof AST_Await) { } else if (expr instanceof AST_Await) {
extract_candidates(expr.expression, unused); extract_candidates(expr.expression, unused);
} else if (expr instanceof AST_Binary) { } else if (expr instanceof AST_Binary) {
@@ -2555,6 +2552,7 @@ merge(Compressor.prototype, {
force_single = false; force_single = false;
return; return;
} }
if (remaining < 1) return;
var value = rhs instanceof AST_Assign && rhs.operator == "=" ? rhs.left : rhs; var value = rhs instanceof AST_Assign && rhs.operator == "=" ? rhs.left : rhs;
if (!(value instanceof AST_SymbolRef)) return; if (!(value instanceof AST_SymbolRef)) return;
var def = value.definition(); var def = value.definition();
@@ -2577,32 +2575,41 @@ merge(Compressor.prototype, {
function get_lhs(expr) { function get_lhs(expr) {
if (expr instanceof AST_Assign) { if (expr instanceof AST_Assign) {
var def, lhs = expr.left; var lhs = expr.left;
if (expr.operator == "=" if (expr.operator != "=") return lhs;
&& lhs instanceof AST_SymbolRef if (!(lhs instanceof AST_SymbolRef)) return lhs;
&& (def = lhs.definition()).references[0] === lhs var def = lhs.definition();
&& !(scope.uses_arguments && is_funarg(def)) if (scope.uses_arguments && is_funarg(def)) return lhs;
&& !compressor.exposed(def)) { if (compressor.exposed(def)) return lhs;
var referenced = def.references.length - def.replaced; remaining = def.references.length - def.replaced - (assignments[def.name] || 0);
if (referenced > 1) mangleable_var(expr.right); if (def.fixed && lhs.fixed) remaining = Math.min(remaining, def.references.filter(function(ref) {
} return ref.fixed === lhs.fixed;
}).length - 1);
mangleable_var(expr.right);
return lhs; return lhs;
} }
if (expr instanceof AST_Binary) return expr.right.left; if (expr instanceof AST_Binary) return expr.right.left;
if (expr instanceof AST_Unary) return expr.expression; if (expr instanceof AST_Unary) return expr.expression;
if (expr instanceof AST_VarDef) { if (expr instanceof AST_VarDef) {
var def = expr.name.definition(); var lhs = expr.name;
var def = lhs.definition();
if (def.const_redefs) return; if (def.const_redefs) return;
if (!member(expr.name, def.orig)) return; if (!member(lhs, def.orig)) return;
if (scope.uses_arguments && is_funarg(def)) return; if (scope.uses_arguments && is_funarg(def)) return;
var declared = def.orig.length - def.eliminated - (declare_only[def.name] || 0); var declared = def.orig.length - def.eliminated - (declare_only[def.name] || 0);
var referenced = def.references.length - def.replaced - (assignments[def.name] || 0); remaining = def.references.length - def.replaced - (assignments[def.name] || 0);
if (declared > 1 && !(expr.name instanceof AST_SymbolFunarg)) { if (def.fixed) remaining = Math.min(remaining, def.references.filter(function(ref) {
if (!ref.fixed) return true;
if (!ref.fixed.assigns) return true;
var assign = ref.fixed.assigns[0];
return assign === lhs || get_rvalue(assign) === expr.value;
}).length);
if (declared > 1 && !(lhs instanceof AST_SymbolFunarg)) {
mangleable_var(expr.value); mangleable_var(expr.value);
return make_node(AST_SymbolRef, expr.name, expr.name); return make_node(AST_SymbolRef, lhs, lhs);
} }
if (mangleable_var(expr.value) || referenced == 1 && !compressor.exposed(def)) { if (mangleable_var(expr.value) || remaining == 1 && !compressor.exposed(def)) {
return make_node(AST_SymbolRef, expr.name, expr.name); return make_node(AST_SymbolRef, lhs, lhs);
} }
return; return;
} }

View File

@@ -4724,7 +4724,7 @@ cascade_statement: {
} }
function f3(a, b) { function f3(a, b) {
for (; a < b; a++) for (; a < b; a++)
if ((c = a) && b) if (c = a, a && b)
var c = c = b(a); var c = c = b(a);
} }
} }

View File

@@ -232,8 +232,9 @@ issue_4736: {
expect: { expect: {
(function() { (function() {
(function() { (function() {
var b = 1 << 30;
0, 0,
console.log(1073741824); console.log(b);
})(); })();
})(); })();
} }