fix break forwarding in outlined code

This commit is contained in:
Alon Zakai 2013-07-16 17:42:40 -07:00
Родитель 4260723fdf
Коммит f5f36712af
3 изменённых файлов: 66 добавлений и 1 удалений

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

@ -3105,7 +3105,6 @@ function outline(ast) {
// Generate new function
if (codeInfo.hasReturn || codeInfo.hasBreak || codeInfo.hasContinue) {
// we need to capture all control flow using a top-level labeled one-time loop in the outlined function
code = [['label', 'OL', ['do', ['num', 0], ['block', code]]]];
var breakCapturers = 0;
var continueCapturers = 0;
traverse(code, function(node, type) {
@ -3158,6 +3157,7 @@ function outline(ast) {
continueCapturers--;
}
});
code = [['label', 'OL', ['do', ['num', 0], ['block', code]]]]; // do this after processing, to not confuse breakCapturers etc.
// read the control data at the callsite to the outlined function
if (codeInfo.hasReturn) {
reps.push(makeIf(

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

@ -37,6 +37,20 @@ function lin3() {
}
return 20;
}
function lin4() {
while (1) {
c(1);
c(2);
c(3);
c(4);
lin4$1(sp);
lin4$0(sp);
if (HEAP32[sp + 0 >> 2] == 1) {
break;
}
}
return 20;
}
function lin$0(sp) {
sp = sp | 0;
c(13);
@ -105,4 +119,29 @@ function lin3$1(sp) {
c(12);
c(13);
}
function lin4$0(sp) {
sp = sp | 0;
OL : do {
c(13);
c(14);
c(15);
c(16);
c(17);
c(18);
c(19);
c(20);
HEAP32[sp + 0 >> 2] = 1, break OL;
} while (0);
}
function lin4$1(sp) {
sp = sp | 0;
c(5);
c(6);
c(7);
c(8);
c(9);
c(10);
c(11);
c(12);
}

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

@ -70,5 +70,31 @@ function lin3() {
}
return 20;
}
function lin4() {
while (1) {
c(1);
c(2);
c(3);
c(4);
c(5);
c(6);
c(7);
c(8);
c(9);
c(10);
c(11);
c(12);
c(13);
c(14);
c(15);
c(16);
c(17);
c(18);
c(19);
c(20);
break;
}
return 20;
}
// EMSCRIPTEN_GENERATED_FUNCTIONS
// EXTRA_INFO: { "sizeToOutline": 30 }