workaround v8 performance quirks (#5207)
This commit is contained in:
@@ -531,6 +531,11 @@ Compressor.prototype.compress = function(node) {
|
||||
});
|
||||
}
|
||||
|
||||
function safe_to_visit(tw, fn) {
|
||||
var marker = fn.safe_ids;
|
||||
return marker === undefined || marker === tw.safe_ids;
|
||||
}
|
||||
|
||||
function walk_fn_def(tw, fn) {
|
||||
var was_scanning = tw.fn_scanning;
|
||||
tw.fn_scanning = fn;
|
||||
@@ -545,14 +550,14 @@ Compressor.prototype.compress = function(node) {
|
||||
d.single_use = false;
|
||||
var fixed = d.fixed;
|
||||
if (typeof fixed == "function") fixed = fixed();
|
||||
if (fixed instanceof AST_Lambda && HOP(fixed, "safe_ids")) return;
|
||||
if (fixed instanceof AST_Lambda && fixed.safe_ids !== undefined) return;
|
||||
d.fixed = false;
|
||||
});
|
||||
}
|
||||
|
||||
function mark_fn_def(tw, def, fn) {
|
||||
if (!HOP(fn, "safe_ids")) return;
|
||||
var marker = fn.safe_ids;
|
||||
if (marker === undefined) return;
|
||||
if (marker === false) return;
|
||||
if (fn.parent_scope.resolve().may_call_this === return_true) {
|
||||
if (member(fn, tw.fn_visited)) revisit_fn_def(tw, fn);
|
||||
@@ -587,10 +592,10 @@ Compressor.prototype.compress = function(node) {
|
||||
walk_fn_def(tw, fn);
|
||||
});
|
||||
fn_defs.forEach(function(fn) {
|
||||
delete fn.safe_ids;
|
||||
fn.safe_ids = undefined;
|
||||
});
|
||||
delete scope.fn_defs;
|
||||
delete scope.may_call_this;
|
||||
scope.fn_defs = undefined;
|
||||
scope.may_call_this = undefined;
|
||||
}
|
||||
|
||||
function push(tw) {
|
||||
@@ -621,7 +626,7 @@ Compressor.prototype.compress = function(node) {
|
||||
if (def.global && def.name == "arguments") return false;
|
||||
tw.loop_ids[def.id] = null;
|
||||
def.fixed = make_node(AST_Undefined, def.orig[0]);
|
||||
if (in_order) delete def.safe_ids;
|
||||
if (in_order) def.safe_ids = undefined;
|
||||
return true;
|
||||
}
|
||||
return !safe.assign || safe.assign === tw.safe_ids;
|
||||
@@ -643,7 +648,7 @@ Compressor.prototype.compress = function(node) {
|
||||
var safe = tw.safe_ids[def.id];
|
||||
if (def.safe_ids) {
|
||||
def.safe_ids[def.id] = false;
|
||||
delete def.safe_ids;
|
||||
def.safe_ids = undefined;
|
||||
return def.fixed === null || HOP(tw.safe_ids, def.id) && !safe.read;
|
||||
}
|
||||
if (!HOP(tw.safe_ids, def.id)) {
|
||||
@@ -1206,7 +1211,7 @@ Compressor.prototype.compress = function(node) {
|
||||
});
|
||||
def(AST_Lambda, function(tw, descend, compressor) {
|
||||
var fn = this;
|
||||
if (HOP(fn, "safe_ids") && fn.safe_ids !== tw.safe_ids) return true;
|
||||
if (!safe_to_visit(tw, fn)) return true;
|
||||
if (!push_uniq(tw.fn_visited, fn)) return true;
|
||||
fn.inlined = false;
|
||||
push(tw);
|
||||
@@ -1221,7 +1226,7 @@ Compressor.prototype.compress = function(node) {
|
||||
var def = fn.name.definition();
|
||||
var parent = tw.parent();
|
||||
if (parent instanceof AST_ExportDeclaration || parent instanceof AST_ExportDefault) def.single_use = false;
|
||||
if (HOP(fn, "safe_ids") && fn.safe_ids !== tw.safe_ids) return true;
|
||||
if (!safe_to_visit(tw, fn)) return true;
|
||||
if (!push_uniq(tw.fn_visited, fn)) return true;
|
||||
fn.inlined = false;
|
||||
push(tw);
|
||||
@@ -1469,8 +1474,8 @@ Compressor.prototype.compress = function(node) {
|
||||
function reset_flags(node) {
|
||||
node._squeezed = false;
|
||||
node._optimized = false;
|
||||
delete node.fixed;
|
||||
if (node instanceof AST_Scope) delete node._var_names;
|
||||
if (node instanceof AST_BlockScope) node._var_names = undefined;
|
||||
if (node instanceof AST_SymbolRef) node.fixed = undefined;
|
||||
}
|
||||
|
||||
AST_Toplevel.DEFMETHOD("reset_opt_flags", function(compressor) {
|
||||
@@ -6592,7 +6597,7 @@ Compressor.prototype.compress = function(node) {
|
||||
argnames.pop();
|
||||
} else if (i > default_length) {
|
||||
log(sym.name, "Dropping unused default argument assignment {name}");
|
||||
sym.name.__unused = true;
|
||||
sym.name.unused = true;
|
||||
argnames[i] = sym.name;
|
||||
} else {
|
||||
log(sym.name, "Dropping unused default argument value {name}");
|
||||
@@ -6603,12 +6608,12 @@ Compressor.prototype.compress = function(node) {
|
||||
var def = sym.definition();
|
||||
if (def.id in in_use_ids) {
|
||||
trim = false;
|
||||
if (indexOf_assign(def, sym) < 0) sym.__unused = null;
|
||||
if (indexOf_assign(def, sym) < 0) sym.unused = null;
|
||||
} else if (trim) {
|
||||
log(sym, "Dropping unused function argument {name}");
|
||||
argnames.pop();
|
||||
} else {
|
||||
sym.__unused = true;
|
||||
sym.unused = true;
|
||||
}
|
||||
}
|
||||
fns_with_marked_args.push(node);
|
||||
@@ -7162,7 +7167,7 @@ Compressor.prototype.compress = function(node) {
|
||||
var value = node.value.drop_side_effect_free(compressor);
|
||||
if (!value) return null;
|
||||
log(node.name, "Side effects in default value of unused variable {name}");
|
||||
node.name.__unused = null;
|
||||
node.name.unused = null;
|
||||
node.value = value;
|
||||
}
|
||||
return node;
|
||||
@@ -7419,7 +7424,7 @@ Compressor.prototype.compress = function(node) {
|
||||
}
|
||||
return make_node(AST_DestructuredObject, node, { properties: [] });
|
||||
}
|
||||
node.__unused = null;
|
||||
node.unused = null;
|
||||
return node;
|
||||
}
|
||||
}
|
||||
@@ -9247,7 +9252,7 @@ Compressor.prototype.compress = function(node) {
|
||||
if (argname instanceof AST_DestructuredObject) {
|
||||
return argname.properties.length == 0 && !argname.rest && arg && !arg.may_throw_on_access(compressor);
|
||||
}
|
||||
return argname.__unused;
|
||||
return argname.unused;
|
||||
} : return_false;
|
||||
var side_effects = [];
|
||||
for (var i = 0; i < args.length; i++) {
|
||||
@@ -9255,7 +9260,7 @@ Compressor.prototype.compress = function(node) {
|
||||
if (drop_defaults && argname instanceof AST_DefaultValue && args[i].is_defined(compressor)) {
|
||||
argnames[i] = argname = argname.name;
|
||||
}
|
||||
if (!argname || "__unused" in argname) {
|
||||
if (!argname || argname.unused !== undefined) {
|
||||
var node = args[i].drop_side_effect_free(compressor);
|
||||
if (drop_fargs(argname)) {
|
||||
if (argname) argnames.splice(i, 1);
|
||||
@@ -9969,7 +9974,7 @@ Compressor.prototype.compress = function(node) {
|
||||
var abort = false;
|
||||
fn.each_argname(function(arg) {
|
||||
if (abort) return;
|
||||
if (arg.__unused) return;
|
||||
if (arg.unused) return;
|
||||
if (!safe_to_inject || var_exists(defined, arg.name)) return abort = true;
|
||||
arg_used.set(arg.name, true);
|
||||
if (in_loop) in_loop.push(arg.definition());
|
||||
@@ -10080,12 +10085,12 @@ Compressor.prototype.compress = function(node) {
|
||||
name = argname;
|
||||
}
|
||||
var value = self.args[i];
|
||||
if (name.__unused || scope.var_names().has(name.name)) {
|
||||
if (name.unused || scope.var_names().has(name.name)) {
|
||||
if (value) expressions.push(value);
|
||||
} else {
|
||||
var symbol = make_node(AST_SymbolVar, name, name);
|
||||
name.definition().orig.push(symbol);
|
||||
if ("__unused" in name) {
|
||||
if (name.unused !== undefined) {
|
||||
append_var(decls, expressions, symbol);
|
||||
if (value) expressions.push(value);
|
||||
} else {
|
||||
@@ -10098,7 +10103,7 @@ Compressor.prototype.compress = function(node) {
|
||||
expressions.reverse();
|
||||
for (i = default_args.length; --i >= 0;) {
|
||||
var node = default_args[i];
|
||||
if ("__unused" in node.name) {
|
||||
if (node.name.unused !== undefined) {
|
||||
expressions.push(node.value);
|
||||
} else {
|
||||
var sym = make_node(AST_SymbolRef, node.name, node.name);
|
||||
@@ -10117,7 +10122,7 @@ Compressor.prototype.compress = function(node) {
|
||||
operator: "=",
|
||||
left: make_node(AST_DestructuredArray, self, {
|
||||
elements: fn.argnames.map(function(argname) {
|
||||
if (argname.__unused) return make_node(AST_Hole, argname);
|
||||
if (argname.unused) return make_node(AST_Hole, argname);
|
||||
return argname.convert_symbol(AST_SymbolRef, process);
|
||||
}),
|
||||
rest: fn.rest && fn.rest.convert_symbol(AST_SymbolRef, process),
|
||||
@@ -12307,7 +12312,7 @@ Compressor.prototype.compress = function(node) {
|
||||
if (assigned) def.reassigned--;
|
||||
var sym = make_node(AST_SymbolRef, self, argname);
|
||||
sym.reference();
|
||||
delete argname.__unused;
|
||||
argname.unused = undefined;
|
||||
return sym;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user