From f8886ef5baa6fe44688ac1f3a76984a322971653 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sun, 18 Oct 2020 18:01:12 +0100 Subject: LibJS: Handle continue in switch statement unwinding --- Libraries/LibJS/AST.cpp | 3 ++- Libraries/LibJS/Tests/switch-basic.js | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp index 098d4699dd..6bf047859a 100644 --- a/Libraries/LibJS/AST.cpp +++ b/Libraries/LibJS/AST.cpp @@ -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 {}; diff --git a/Libraries/LibJS/Tests/switch-basic.js b/Libraries/LibJS/Tests/switch-basic.js index b5cb52ae8d..5c2a851ac0 100644 --- a/Libraries/LibJS/Tests/switch-basic.js +++ b/Libraries/LibJS/Tests/switch-basic.js @@ -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); + }); }); -- cgit v1.2.3