From ce634957c1bd25fdcc39c4e0321bcdf1cc332d60 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 13 May 2023 18:53:14 +0200 Subject: [PATCH] LibJS/Bytecode: Restore old environments when an exception is caught Unwind contexts now remember the lexical and variable environments in effect when they were created. If an exception is caught, we revert to those environments in the running execution context. --- Userland/Libraries/LibJS/Bytecode/BasicBlock.h | 4 ++++ Userland/Libraries/LibJS/Bytecode/Interpreter.cpp | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibJS/Bytecode/BasicBlock.h b/Userland/Libraries/LibJS/Bytecode/BasicBlock.h index 76533d67d5..fe046434a5 100644 --- a/Userland/Libraries/LibJS/Bytecode/BasicBlock.h +++ b/Userland/Libraries/LibJS/Bytecode/BasicBlock.h @@ -9,6 +9,7 @@ #include #include #include +#include namespace JS::Bytecode { @@ -16,6 +17,9 @@ struct UnwindInfo { Executable const* executable; BasicBlock const* handler; BasicBlock const* finalizer; + + Handle lexical_environment; + Handle variable_environment; }; class BasicBlock { diff --git a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp index 44d21b75bf..c6dfb3aa48 100644 --- a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp @@ -91,6 +91,8 @@ Interpreter::ValueAndFrame Interpreter::run_and_return_frame(Executable const& e if (unwind_context.executable != m_current_executable) break; if (unwind_context.handler) { + vm().running_execution_context().lexical_environment = unwind_context.lexical_environment; + vm().running_execution_context().variable_environment = unwind_context.variable_environment; m_current_block = unwind_context.handler; unwind_context.handler = nullptr; @@ -205,7 +207,12 @@ Interpreter::ValueAndFrame Interpreter::run_and_return_frame(Executable const& e void Interpreter::enter_unwind_context(Optional