LibJS/Bytecode: Setup lexical environment boundary for with statements

This allows us to properly unwind the object environment for `with` on
a block terminating instruction, e.g. an unconditional throw.
This commit is contained in:
Luke Wilde 2022-03-14 02:35:45 +00:00 committed by Ali Mohammad Pur
parent 9f4cc6435d
commit 04774f923f
Notes: sideshowbarker 2024-07-17 17:27:01 +09:00

View File

@ -1625,8 +1625,15 @@ Bytecode::CodeGenerationErrorOr<void> WithStatement::generate_bytecode(Bytecode:
{
TRY(m_object->generate_bytecode(generator));
generator.emit<Bytecode::Op::EnterObjectEnvironment>();
// EnterObjectEnvironment sets the running execution context's lexical_environment to a new Object Environment.
generator.start_boundary(Bytecode::Generator::BlockBoundaryType::LeaveLexicalEnvironment);
TRY(m_body->generate_bytecode(generator));
generator.emit<Bytecode::Op::LeaveEnvironment>(Bytecode::Op::EnvironmentMode::Lexical);
generator.end_boundary(Bytecode::Generator::BlockBoundaryType::LeaveLexicalEnvironment);
if (!generator.is_current_block_terminated())
generator.emit<Bytecode::Op::LeaveEnvironment>(Bytecode::Op::EnvironmentMode::Lexical);
return {};
}