diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp index 60de3d9383..9286c0aaa6 100644 --- a/Libraries/LibJS/AST.cpp +++ b/Libraries/LibJS/AST.cpp @@ -262,6 +262,16 @@ Value WhileStatement::execute(Interpreter& interpreter, GlobalObject& global_obj last_value = interpreter.execute_statement(global_object, *m_body); if (interpreter.exception()) return {}; + if (interpreter.vm().should_unwind()) { + if (interpreter.vm().should_unwind_until(ScopeType::Continuable, m_label)) { + interpreter.vm().stop_unwind(); + } else if (interpreter.vm().should_unwind_until(ScopeType::Breakable, m_label)) { + interpreter.vm().stop_unwind(); + break; + } else { + return js_undefined(); + } + } } return last_value; @@ -276,6 +286,16 @@ Value DoWhileStatement::execute(Interpreter& interpreter, GlobalObject& global_o last_value = interpreter.execute_statement(global_object, *m_body); if (interpreter.exception()) return {}; + if (interpreter.vm().should_unwind()) { + if (interpreter.vm().should_unwind_until(ScopeType::Continuable, m_label)) { + interpreter.vm().stop_unwind(); + } else if (interpreter.vm().should_unwind_until(ScopeType::Breakable, m_label)) { + interpreter.vm().stop_unwind(); + break; + } else { + return js_undefined(); + } + } } while (m_test->execute(interpreter, global_object).to_boolean()); return last_value; diff --git a/Libraries/LibJS/Tests/return.js b/Libraries/LibJS/Tests/return.js new file mode 100644 index 0000000000..e69de29bb2