enhance collapse_vars (#4885)
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -232,8 +232,9 @@ issue_4736: {
|
|||||||
expect: {
|
expect: {
|
||||||
(function() {
|
(function() {
|
||||||
(function() {
|
(function() {
|
||||||
|
var b = 1 << 30;
|
||||||
0,
|
0,
|
||||||
console.log(1073741824);
|
console.log(b);
|
||||||
})();
|
})();
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user