diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2017-11-24 04:12:37 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-24 04:12:37 +0800 |
commit | 8987780db66ad178f42bdd817f27853b55c37b27 (patch) | |
tree | 771e59c0f0383af61b9fd8e8ef55945625078f9a /lib/compress.js | |
parent | 30cfea2e7a95fd5aaa8092ea0b305ef0be760534 (diff) | |
download | tracifyjs-8987780db66ad178f42bdd817f27853b55c37b27.tar.gz tracifyjs-8987780db66ad178f42bdd817f27853b55c37b27.zip |
eliminate invalid state caching in `collapse_vars` (#2502)
fixes #2497
Diffstat (limited to 'lib/compress.js')
-rw-r--r-- | lib/compress.js | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/lib/compress.js b/lib/compress.js index 4727aad4..987ad01c 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -869,7 +869,7 @@ merge(Compressor.prototype, { && !(node instanceof AST_SymbolDeclaration) && lhs.equivalent_to(node)) { if (is_lhs(node, parent)) { - if (candidate.multiple) replaced++; + if (value_def) replaced++; return node; } CHANGED = abort = true; @@ -884,7 +884,7 @@ merge(Compressor.prototype, { return make_node(AST_UnaryPrefix, candidate, candidate); } if (candidate instanceof AST_VarDef) { - if (candidate.multiple) { + if (value_def) { abort = false; return node; } @@ -958,12 +958,13 @@ merge(Compressor.prototype, { extract_candidates(statements[stat_index]); while (candidates.length > 0) { var candidate = candidates.pop(); + var value_def = null; var lhs = get_lhs(candidate); if (!lhs || is_lhs_read_only(lhs) || lhs.has_side_effects(compressor)) continue; // Locate symbols which may execute code outside of scanning range var lvalues = get_lvalues(candidate); if (lhs instanceof AST_SymbolRef) lvalues[lhs.name] = false; - var replace_all = candidate.multiple; + var replace_all = value_def; if (!replace_all && lhs instanceof AST_SymbolRef) { var def = lhs.definition(); replace_all = def.references.length - def.replaced == 1; @@ -980,13 +981,12 @@ merge(Compressor.prototype, { for (var i = stat_index; !abort && i < statements.length; i++) { statements[i].transform(scanner); } - if (candidate.multiple) { + if (value_def) { var def = candidate.name.definition(); if (abort && def.references.length - def.replaced > replaced) replaced = false; else { abort = false; hit = candidate.name instanceof AST_SymbolFunarg; - var value_def = candidate.value.definition(); for (var i = stat_index; !abort && i < statements.length; i++) { statements[i].transform(multi_replacer); } @@ -1061,13 +1061,13 @@ merge(Compressor.prototype, { } } - function mangleable_var(expr) { - var value = expr.value; - if (!(value instanceof AST_SymbolRef)) return false; - if (value.name == "arguments") return false; - if (value.definition().undeclared) return false; - expr.multiple = true; - return true; + function mangleable_var(var_def) { + var value = var_def.value; + if (!(value instanceof AST_SymbolRef)) return; + if (value.name == "arguments") return; + var def = value.definition(); + if (def.undeclared) return; + return value_def = def; } function get_lhs(expr) { |