do not optimize while into do-while if there are continues; fixes #1337

This commit is contained in:
Alon Zakai 2013-06-30 12:49:32 -07:00
Родитель 6e3a916b14
Коммит 547b13cf5b
3 изменённых файлов: 79 добавлений и 0 удалений

Просмотреть файл

@ -2807,6 +2807,23 @@ function asmLoopOptimizer(ast) {
var stats = node[2][1];
var last = stats[stats.length-1];
if (last && last[0] === 'if' && !last[3] && last[2][0] === 'block' && last[2][1][0] && last[2][1][0][0] === 'break' && !last[2][1][0][1]) {
var abort = false;
var stack = 0;
traverse(stats, function(node, type) {
if (type == 'continue') {
if (stack == 0 || node[1]) { // abort if labeled (we do not analyze labels here yet), or a continue directly on us
abort = true;
return true;
}
} else if (type in LOOP) {
stack++;
}
}, function(node, type) {
if (type in LOOP) {
stack--;
}
});
if (abort) return;
var conditionToBreak = last[1];
stats.pop();
node[0] = 'do';

Просмотреть файл

@ -42,5 +42,33 @@ function looop() {
do {
do_it();
} while (x());
while (1) {
do_it();
if (a()) continue;
if (!x()) {
break;
}
}
do {
do_it();
do {
if (a()) continue;
} while (b());
} while (x());
do {
do_it();
while (b()) {
if (a()) continue;
}
} while (x());
X : while (1) {
do_it();
while (b()) {
if (a()) continue X;
}
if (!x()) {
break;
}
}
}

Просмотреть файл

@ -51,6 +51,40 @@ function looop() {
break;
}
}
while (1) {
do_it();
if (a()) continue; // we cannot move to do-while, continue will hit the while check
if (!x()) {
break;
}
}
while (1) {
do_it();
do {
if (a()) continue; // ok to optimize, continue is not for us
} while (b());
if (!x()) {
break;
}
}
while (1) {
do_it();
while (b()) {
if (a()) continue; // also ok to optimize, continue is not for us
}
if (!x()) {
break;
}
}
X: while (1) {
do_it();
while (b()) {
if (a()) continue X; // not ok to optimize
}
if (!x()) {
break;
}
}
}
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["finall", "looop"]