diff options
-rw-r--r-- | Libraries/LibJS/AST.cpp | 13 | ||||
-rw-r--r-- | Libraries/LibJS/Tests/switch-basic.js | 13 |
2 files changed, 22 insertions, 4 deletions
diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp index 044f35bac5..098d4699dd 100644 --- a/Libraries/LibJS/AST.cpp +++ b/Libraries/LibJS/AST.cpp @@ -1469,7 +1469,7 @@ Value VariableDeclaration::execute(Interpreter& interpreter, GlobalObject& globa Value VariableDeclarator::execute(Interpreter&, GlobalObject&) const { - // NOTE: This node is handled by VariableDeclaration. + // NOTE: VariableDeclarator execution is handled by VariableDeclaration. ASSERT_NOT_REACHED(); } @@ -1894,15 +1894,18 @@ Value SwitchStatement::execute(Interpreter& interpreter, GlobalObject& global_ob falling_through = true; for (auto& statement : switch_case.consequent()) { - statement.execute(interpreter, global_object); + auto last_value = statement.execute(interpreter, global_object); if (interpreter.exception()) return {}; if (interpreter.vm().should_unwind()) { - if (interpreter.vm().should_unwind_until(ScopeType::Breakable, m_label)) { + if (interpreter.vm().should_unwind_until(ScopeType::Continuable, m_label)) { + ASSERT_NOT_REACHED(); + } else if (interpreter.vm().should_unwind_until(ScopeType::Breakable, m_label)) { interpreter.vm().stop_unwind(); return {}; + } else { + return last_value; } - return {}; } } } @@ -1912,6 +1915,8 @@ Value SwitchStatement::execute(Interpreter& interpreter, GlobalObject& global_ob Value SwitchCase::execute(Interpreter&, GlobalObject&) const { + // NOTE: SwitchCase execution is handled by SwitchStatement. + ASSERT_NOT_REACHED(); return {}; } diff --git a/Libraries/LibJS/Tests/switch-basic.js b/Libraries/LibJS/Tests/switch-basic.js index 31aa6a52e7..b5cb52ae8d 100644 --- a/Libraries/LibJS/Tests/switch-basic.js +++ b/Libraries/LibJS/Tests/switch-basic.js @@ -36,4 +36,17 @@ describe("basic switch tests", () => { expect().fail(); }); + + test("return from switch statement", () => { + function foo(value) { + switch (value) { + case 42: + return "return from 'case 42'"; + default: + return "return from 'default'"; + } + } + expect(foo(42)).toBe("return from 'case 42'"); + expect(foo(43)).toBe("return from 'default'"); + }); }); |