do not optimize while into do-while if there are continues; fixes #1337
This commit is contained in:
Родитель
6e3a916b14
Коммит
547b13cf5b
|
@ -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"]
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче