aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2017-11-24 04:12:37 +0800
committerGitHub <noreply@github.com>2017-11-24 04:12:37 +0800
commit8987780db66ad178f42bdd817f27853b55c37b27 (patch)
tree771e59c0f0383af61b9fd8e8ef55945625078f9a
parent30cfea2e7a95fd5aaa8092ea0b305ef0be760534 (diff)
downloadtracifyjs-8987780db66ad178f42bdd817f27853b55c37b27.tar.gz
tracifyjs-8987780db66ad178f42bdd817f27853b55c37b27.zip
eliminate invalid state caching in `collapse_vars` (#2502)
fixes #2497
-rw-r--r--lib/compress.js24
-rw-r--r--test/compress/collapse_vars.js40
2 files changed, 52 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) {
diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js
index 10735b28..e89d44df 100644
--- a/test/compress/collapse_vars.js
+++ b/test/compress/collapse_vars.js
@@ -3578,3 +3578,43 @@ issue_2436_14: {
}
expect_stdout: true
}
+
+issue_2497: {
+ options = {
+ collapse_vars: true,
+ unused: true,
+ }
+ input: {
+ function sample() {
+ if (true) {
+ for (var i = 0; i < 1; ++i) {
+ for (var k = 0; k < 1; ++k) {
+ var value = 1;
+ var x = value;
+ value = x ? x + 1 : 0;
+ }
+ }
+ } else {
+ for (var i = 0; i < 1; ++i) {
+ for (var k = 0; k < 1; ++k) {
+ var value = 1;
+ }
+ }
+ }
+ }
+ }
+ expect: {
+ function sample() {
+ if (true)
+ for (i = 0; i < 1; ++i)
+ for (k = 0; k < 1; ++k) {
+ value = 1;
+ value = value ? value + 1 : 0;
+ }
+ else
+ for (var i = 0; i < 1; ++i)
+ for (var k = 0; k < 1; ++k)
+ var value=1;
+ }
+ }
+}