From d980073122bbb17a805acee3ac34c4f788f87f4b Mon Sep 17 00:00:00 2001 From: Matthew Olsson Date: Thu, 8 Oct 2020 13:12:31 -0700 Subject: LibJS: Handle unwinding in while and do-while statements For some reason, this was never added. So something like "while (true) { return }" would loop infinitely. --- Libraries/LibJS/AST.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'Libraries/LibJS/AST.cpp') 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; -- cgit v1.2.3