workaround v8 performance quirks

This commit is contained in:
alexlamsl 2021-12-08 21:14:14 +08:00
parent bc27966a19
commit 97d4dab914

View File

@ -6412,7 +6412,7 @@ Compressor.prototype.compress = function(node) {
Object.keys(assign_in_use).forEach(function(id) { Object.keys(assign_in_use).forEach(function(id) {
var assigns = assign_in_use[id]; var assigns = assign_in_use[id];
if (!assigns) { if (!assigns) {
delete assign_in_use[id]; assign_in_use[id] = undefined;
return; return;
} }
assigns = assigns.reduce(function(in_use, assigns) { assigns = assigns.reduce(function(in_use, assigns) {
@ -6433,7 +6433,7 @@ Compressor.prototype.compress = function(node) {
if (assigns.length == in_use.length) { if (assigns.length == in_use.length) {
assign_in_use[id] = in_use; assign_in_use[id] = in_use;
} else { } else {
delete assign_in_use[id]; assign_in_use[id] = undefined;
} }
}); });
// pass 3: we should drop declarations not in_use // pass 3: we should drop declarations not in_use
@ -6834,10 +6834,10 @@ Compressor.prototype.compress = function(node) {
} }
case 1: case 1:
if (tail.length == 0) { if (tail.length == 0) {
var id = head[0].name.definition().id; var for_in = for_ins[head[0].name.definition().id];
if (id in for_ins) { if (for_in) {
node.definitions = head; node.definitions = head;
for_ins[id].init = node; for_in.init = node;
break; break;
} }
} }
@ -6932,7 +6932,7 @@ Compressor.prototype.compress = function(node) {
var def = sym.definition(); var def = sym.definition();
if (def.id in in_use_ids) return; if (def.id in in_use_ids) return;
log(sym, "Dropping unused loop variable {name}"); log(sym, "Dropping unused loop variable {name}");
if (for_ins[def.id] === node) delete for_ins[def.id]; if (for_ins[def.id] === node) for_ins[def.id] = undefined;
var body = []; var body = [];
var value = node.object.drop_side_effect_free(compressor); var value = node.object.drop_side_effect_free(compressor);
if (value) { if (value) {
@ -7115,7 +7115,7 @@ Compressor.prototype.compress = function(node) {
if (node instanceof AST_ForIn) { if (node instanceof AST_ForIn) {
if (node.init instanceof AST_SymbolRef && scope === self) { if (node.init instanceof AST_SymbolRef && scope === self) {
var id = node.init.definition().id; var id = node.init.definition().id;
if (!(id in for_ins)) for_ins[id] = node; if (!for_ins[id]) for_ins[id] = node;
} }
if (!drop_vars || !compressor.option("loops")) return; if (!drop_vars || !compressor.option("loops")) return;
if (!is_empty(node.body)) return; if (!is_empty(node.body)) return;