diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/compress.js | 53 |
1 files changed, 26 insertions, 27 deletions
diff --git a/lib/compress.js b/lib/compress.js index f84409ff..9e4ab315 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -5751,38 +5751,34 @@ merge(Compressor.prototype, { } var parent = compressor.parent(); if (compressor.option("reduce_vars") && is_lhs(self, parent) !== self) { - var d = self.definition(); + var def = self.definition(); var fixed = self.fixed_value(); - var single_use = d.single_use - && !(parent instanceof AST_Call && parent.is_expr_pure(compressor)); + var single_use = def.single_use && !(parent instanceof AST_Call && parent.is_expr_pure(compressor)); if (single_use && fixed instanceof AST_Lambda) { - if (d.scope !== self.scope - && (!compressor.option("reduce_funcs") - || d.escaped == 1 - || fixed.inlined)) { + if (def.scope !== self.scope + && (!compressor.option("reduce_funcs") || def.escaped == 1 || fixed.inlined)) { single_use = false; - } else if (recursive_ref(compressor, d)) { + } else if (recursive_ref(compressor, def)) { single_use = false; - } else if (d.scope !== self.scope || d.orig[0] instanceof AST_SymbolFunarg) { + } else if (def.scope !== self.scope || def.orig[0] instanceof AST_SymbolFunarg) { single_use = fixed.is_constant_expression(self.scope); if (single_use == "f") { var scope = self.scope; - do { - if (scope instanceof AST_Defun || scope instanceof AST_Function) { - scope.inlined = true; - } + do if (scope instanceof AST_Defun || scope instanceof AST_Function) { + scope.inlined = true; } while (scope = scope.parent_scope); } } } if (single_use && fixed) { + def.single_use = false; if (fixed instanceof AST_Defun) { fixed._squeezed = true; fixed = make_node(AST_Function, fixed, fixed); fixed.name = make_node(AST_SymbolLambda, fixed.name, fixed.name); } var value; - if (d.recursive_refs > 0) { + if (def.recursive_refs > 0) { value = fixed.clone(true); var defun_def = value.name.definition(); var lambda_def = value.variables.get(value.name.name); @@ -5794,9 +5790,13 @@ merge(Compressor.prototype, { lambda_def = value.def_function(name); } value.walk(new TreeWalker(function(node) { - if (node instanceof AST_SymbolRef && node.definition() === defun_def) { + if (!(node instanceof AST_SymbolRef)) return; + var def = node.definition(); + if (def === defun_def) { node.thedef = lambda_def; lambda_def.references.push(node); + } else { + def.single_use = false; } })); } else { @@ -5805,13 +5805,12 @@ merge(Compressor.prototype, { } return value; } - if (fixed && d.should_replace === undefined) { + if (fixed && def.should_replace === undefined) { var init; if (fixed instanceof AST_This) { - if (!(d.orig[0] instanceof AST_SymbolFunarg) - && all(d.references, function(ref) { - return d.scope === ref.scope; - })) { + if (!(def.orig[0] instanceof AST_SymbolFunarg) && all(def.references, function(ref) { + return def.scope === ref.scope; + })) { init = fixed; } } else { @@ -5835,18 +5834,18 @@ merge(Compressor.prototype, { return result === init || result === fixed ? result.clone(true) : result; }; } - var name_length = d.name.length; + var name_length = def.name.length; var overhead = 0; - if (compressor.option("unused") && !compressor.exposed(d)) { - overhead = (name_length + 2 + value_length) / (d.references.length - d.assignments); + if (compressor.option("unused") && !compressor.exposed(def)) { + overhead = (name_length + 2 + value_length) / (def.references.length - def.assignments); } - d.should_replace = value_length <= name_length + overhead ? fn : false; + def.should_replace = value_length <= name_length + overhead ? fn : false; } else { - d.should_replace = false; + def.should_replace = false; } } - if (d.should_replace) { - return d.should_replace(); + if (def.should_replace) { + return def.should_replace(); } } return self; |