fix break forwarding in outlined code
This commit is contained in:
Родитель
4260723fdf
Коммит
f5f36712af
|
@ -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 }
|
||||
|
|
Загрузка…
Ссылка в новой задаче