aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkzc <kzc@users.noreply.github.com>2017-03-06 12:42:33 -0500
committerAlex Lam S.L <alexlamsl@gmail.com>2017-03-07 01:42:33 +0800
commit3ac24219322384539caae803482ea257e7971cf2 (patch)
tree8964d96e572a22d450fc78a87b8e8c7717d60999
parenta9fc9ddc3371a2ba051bca849db3c4b73983f24d (diff)
downloadtracifyjs-3ac24219322384539caae803482ea257e7971cf2.tar.gz
tracifyjs-3ac24219322384539caae803482ea257e7971cf2.zip
collapse_vars: do not replace a constant in loop condition or init (#1562)
-rw-r--r--lib/compress.js9
-rw-r--r--test/compress/collapse_vars.js50
2 files changed, 48 insertions, 11 deletions
diff --git a/lib/compress.js b/lib/compress.js
index d9a67c16..8c3fb155 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -535,10 +535,13 @@ merge(Compressor.prototype, {
// Constant single use vars can be replaced in any scope.
if (var_decl.value.is_constant()) {
var ctt = new TreeTransformer(function(node) {
- if (node === ref
- && !ctt.find_parent(AST_ForIn)) {
- return replace_var(node, ctt.parent(), true);
+ var parent = ctt.parent();
+ if (parent instanceof AST_IterationStatement
+ && (parent.condition === node || parent.init === node)) {
+ return node;
}
+ if (node === ref)
+ return replace_var(node, parent, true);
});
stat.transform(ctt);
continue;
diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js
index 82d943ff..6d7e2d9f 100644
--- a/test/compress/collapse_vars.js
+++ b/test/compress/collapse_vars.js
@@ -344,9 +344,9 @@ collapse_vars_do_while: {
}
input: {
function f1(y) {
- // The constant do-while condition `c` will be replaced.
+ // The constant do-while condition `c` will not be replaced.
var c = 9;
- do { } while (c === 77);
+ do {} while (c === 77);
}
function f2(y) {
// The non-constant do-while condition `c` will not be replaced.
@@ -381,7 +381,8 @@ collapse_vars_do_while: {
}
expect: {
function f1(y) {
- do ; while (false);
+ var c = 9;
+ do ; while (77 === c);
}
function f2(y) {
var c = 5 - y;
@@ -418,9 +419,9 @@ collapse_vars_do_while_drop_assign: {
}
input: {
function f1(y) {
- // The constant do-while condition `c` will be replaced.
+ // The constant do-while condition `c` will be not replaced.
var c = 9;
- do { } while (c === 77);
+ do {} while (c === 77);
}
function f2(y) {
// The non-constant do-while condition `c` will not be replaced.
@@ -455,7 +456,8 @@ collapse_vars_do_while_drop_assign: {
}
expect: {
function f1(y) {
- do ; while (false);
+ var c = 9;
+ do ; while (77 === c);
}
function f2(y) {
var c = 5 - y;
@@ -1309,8 +1311,8 @@ collapse_vars_regexp: {
};
}
(function(){
- var result, rx = /ab*/g;
- while (result = rx.exec('acdabcdeabbb'))
+ var result, s = "acdabcdeabbb", rx = /ab*/g;
+ while (result = rx.exec(s))
console.log(result[0]);
})();
}
@@ -1329,3 +1331,35 @@ issue_1537: {
for (k in {prop: 'val'});
}
}
+
+issue_1562: {
+ options = {
+ collapse_vars: true,
+ }
+ input: {
+ var v = 1, B = 2;
+ for (v in objs) f(B);
+
+ var x = 3, C = 10;
+ while(x + 2) bar(C);
+
+ var y = 4, D = 20;
+ do bar(D); while(y + 2);
+
+ var z = 5, E = 30;
+ for (; f(z + 2) ;) bar(E);
+ }
+ expect: {
+ var v = 1;
+ for (v in objs) f(2);
+
+ var x = 3;
+ while(x + 2) bar(10);
+
+ var y = 4;
+ do bar(20); while(y + 2);
+
+ var z = 5;
+ for (; f(z + 2) ;) bar(30);
+ }
+}