Bug 1334799 - Handle stack value in correct order when leaving for-of loop from finally block

Issue #74
This commit is contained in:
janekptacijarabaci 2018-03-25 12:56:18 +02:00 committed by Roy Tam
commit 62a9d049ec
2 changed files with 31 additions and 7 deletions

View file

@ -2396,6 +2396,9 @@ NonLocalExitControl::prepareForNonLocalJump(BytecodeEmitter::NestableControl* ta
}
}
if (!flushPops(bce_))
return false;
if (target && target->is<ForOfLoopControl>() && emitIteratorCloseAtTarget) {
hasForOfLoopsWithIteratorClose = true;
if (!target->as<ForOfLoopControl>().finishIterCloseTryNote(bce_))
@ -2417,9 +2420,6 @@ NonLocalExitControl::prepareForNonLocalJump(BytecodeEmitter::NestableControl* ta
return false;
}
if (!flushPops(bce_))
return false;
// See comment in ForOfLoopControl.
if (hasForOfLoopsWithIteratorClose) {
for (NestableControl* control = bce_->innermostNestableControl;

View file

@ -4,6 +4,24 @@ var summary =
print(BUGNUMBER + ": " + summary);
var called = 0;
function reset() {
called = 0;
}
var obj = {
[Symbol.iterator]() {
return {
next() {
return { value: 10, done: false };
},
return() {
called++;
return {};
}
};
}
};
var a = (function () {
for (var x in [0]) {
try {} finally {
@ -13,32 +31,37 @@ var a = (function () {
})();
assertEq(a, 11);
reset();
var b = (function () {
for (var x of [0]) {
for (var x of obj) {
try {} finally {
return 12;
}
}
})();
assertEq(called, 1);
assertEq(b, 12);
reset();
var c = (function () {
for (var x in [0]) {
for (var y of [0]) {
for (var y of obj) {
try {} finally {
return 13;
}
}
}
})();
assertEq(called, 1);
assertEq(c, 13);
reset();
var d = (function () {
for (var x in [0]) {
for (var y of [0]) {
for (var y of obj) {
try {} finally {
for (var z in [0]) {
for (var w of [0]) {
for (var w of obj) {
try {} finally {
return 14;
}
@ -48,6 +71,7 @@ var d = (function () {
}
}
})();
assertEq(called, 2);
assertEq(d, 14);
if (typeof reportCompare === "function")