collapse_vars: do not replace a constant in loop condition or init (#1562)

This commit is contained in:
kzc
2017-03-06 12:42:33 -05:00
committed by Alex Lam S.L
parent a9fc9ddc33
commit 3ac2421932
2 changed files with 48 additions and 11 deletions

View File

@@ -535,10 +535,13 @@ merge(Compressor.prototype, {
// Constant single use vars can be replaced in any scope. // Constant single use vars can be replaced in any scope.
if (var_decl.value.is_constant()) { if (var_decl.value.is_constant()) {
var ctt = new TreeTransformer(function(node) { var ctt = new TreeTransformer(function(node) {
if (node === ref var parent = ctt.parent();
&& !ctt.find_parent(AST_ForIn)) { if (parent instanceof AST_IterationStatement
return replace_var(node, ctt.parent(), true); && (parent.condition === node || parent.init === node)) {
return node;
} }
if (node === ref)
return replace_var(node, parent, true);
}); });
stat.transform(ctt); stat.transform(ctt);
continue; continue;

View File

@@ -344,9 +344,9 @@ collapse_vars_do_while: {
} }
input: { input: {
function f1(y) { 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; var c = 9;
do { } while (c === 77); do {} while (c === 77);
} }
function f2(y) { function f2(y) {
// The non-constant do-while condition `c` will not be replaced. // The non-constant do-while condition `c` will not be replaced.
@@ -381,7 +381,8 @@ collapse_vars_do_while: {
} }
expect: { expect: {
function f1(y) { function f1(y) {
do ; while (false); var c = 9;
do ; while (77 === c);
} }
function f2(y) { function f2(y) {
var c = 5 - y; var c = 5 - y;
@@ -418,9 +419,9 @@ collapse_vars_do_while_drop_assign: {
} }
input: { input: {
function f1(y) { 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; var c = 9;
do { } while (c === 77); do {} while (c === 77);
} }
function f2(y) { function f2(y) {
// The non-constant do-while condition `c` will not be replaced. // The non-constant do-while condition `c` will not be replaced.
@@ -455,7 +456,8 @@ collapse_vars_do_while_drop_assign: {
} }
expect: { expect: {
function f1(y) { function f1(y) {
do ; while (false); var c = 9;
do ; while (77 === c);
} }
function f2(y) { function f2(y) {
var c = 5 - y; var c = 5 - y;
@@ -1309,8 +1311,8 @@ collapse_vars_regexp: {
}; };
} }
(function(){ (function(){
var result, rx = /ab*/g; var result, s = "acdabcdeabbb", rx = /ab*/g;
while (result = rx.exec('acdabcdeabbb')) while (result = rx.exec(s))
console.log(result[0]); console.log(result[0]);
})(); })();
} }
@@ -1329,3 +1331,35 @@ issue_1537: {
for (k in {prop: 'val'}); 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);
}
}