From 896c477107f7ffc00fb753c69e5fb900ebd50d7f Mon Sep 17 00:00:00 2001 From: Luke Wilde Date: Sun, 17 Jul 2022 19:22:18 +0100 Subject: [PATCH] LibJS/Bytecode: Don't begin breakable scope before variable scope in for This is no longer required, since the variable scope is ended after switching to the end block, which means that LeaveLexicalEnvironment will always be generated instead of depending on the unwind mechanism to handle it for us. --- Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 8240d330f5..1ad3ddd487 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -827,9 +827,6 @@ Bytecode::CodeGenerationErrorOr ForStatement::generate_labelled_evaluation bool has_lexical_environment = false; - // The breakable scope needs to start here to unwind the potentially created lexical environment for the init bytecode. - generator.begin_breakable_scope(Bytecode::Label { end_block }, label_set); - if (m_init) { if (m_init->is_variable_declaration()) { auto& variable_declaration = verify_cast(*m_init); @@ -882,7 +879,9 @@ Bytecode::CodeGenerationErrorOr ForStatement::generate_labelled_evaluation generator.switch_to_basic_block(*body_block_ptr); generator.begin_continuable_scope(Bytecode::Label { *update_block_ptr }, label_set); + generator.begin_breakable_scope(Bytecode::Label { end_block }, label_set); TRY(m_body->generate_bytecode(generator)); + generator.end_breakable_scope(); generator.end_continuable_scope(); if (!generator.is_current_block_terminated()) { @@ -906,7 +905,6 @@ Bytecode::CodeGenerationErrorOr ForStatement::generate_labelled_evaluation if (has_lexical_environment) generator.end_variable_scope(); - generator.end_breakable_scope(); return {}; }