LibJS: Handle continue in switch statement unwinding

This commit is contained in:
Linus Groh 2020-10-18 18:01:12 +01:00 committed by Andreas Kling
parent 8f54edb7a0
commit f8886ef5ba
Notes: sideshowbarker 2024-07-19 01:51:22 +09:00
2 changed files with 20 additions and 1 deletions

View file

@ -1899,7 +1899,8 @@ Value SwitchStatement::execute(Interpreter& interpreter, GlobalObject& global_ob
return {};
if (interpreter.vm().should_unwind()) {
if (interpreter.vm().should_unwind_until(ScopeType::Continuable, m_label)) {
ASSERT_NOT_REACHED();
// No stop_unwind(), the outer loop will handle that - we just need to break out of the switch/case.
return {};
} else if (interpreter.vm().should_unwind_until(ScopeType::Breakable, m_label)) {
interpreter.vm().stop_unwind();
return {};

View file

@ -49,4 +49,22 @@ describe("basic switch tests", () => {
expect(foo(42)).toBe("return from 'case 42'");
expect(foo(43)).toBe("return from 'default'");
});
test("continue from switch statement", () => {
let i = 0;
for (; i < 5; ++i) {
switch (i) {
case 0:
continue;
expect().fail();
case 0:
expect().fail();
default:
continue;
expect().fail();
}
expect().fail();
}
expect(i).toBe(5);
});
});