summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Libraries/LibJS/AST.cpp13
-rw-r--r--Libraries/LibJS/Tests/switch-basic.js13
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'");
+ });
});