From 97af7654dd3d5d6917d2693ba2162d0035750f21 Mon Sep 17 00:00:00 2001 From: Luke Wilde Date: Mon, 14 Mar 2022 02:38:13 +0000 Subject: [PATCH] LibJS/Bytecode: Setup declarative environment for catch with variable --- Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 3bd8ee32d7..4453d9d011 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -1479,11 +1479,14 @@ Bytecode::CodeGenerationErrorOr TryStatement::generate_bytecode(Bytecode:: if (m_handler) { auto& handler_block = generator.make_block(); generator.switch_to_basic_block(handler_block); + generator.begin_variable_scope(Bytecode::Generator::BindingMode::Lexical, Bytecode::Generator::SurroundingScopeKind::Block); TRY(m_handler->parameter().visit( [&](FlyString const& parameter) -> Bytecode::CodeGenerationErrorOr { if (!parameter.is_empty()) { - // FIXME: We need a separate DeclarativeEnvironment here - generator.emit(generator.intern_identifier(parameter)); + auto parameter_identifier = generator.intern_identifier(parameter); + generator.register_binding(parameter_identifier); + generator.emit(parameter_identifier, Bytecode::Op::EnvironmentMode::Lexical, false); + generator.emit(parameter_identifier, Bytecode::Op::SetVariable::InitializationMode::Initialize); } return {}; }, @@ -1497,6 +1500,8 @@ Bytecode::CodeGenerationErrorOr TryStatement::generate_bytecode(Bytecode:: TRY(m_handler->body().generate_bytecode(generator)); handler_target = Bytecode::Label { handler_block }; + generator.end_variable_scope(); + if (!generator.is_current_block_terminated()) { if (m_finalizer) { generator.emit();