diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 1db9b3f5e8..bc878b8775 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -23,8 +23,11 @@ void ASTNode::generate_bytecode(Bytecode::Generator&) const void ScopeNode::generate_bytecode(Bytecode::Generator& generator) const { generator.emit(*this); - for (auto& child : children()) + for (auto& child : children()) { child.generate_bytecode(generator); + if (generator.is_current_block_terminated()) + break; + } } void EmptyStatement::generate_bytecode(Bytecode::Generator&) const @@ -329,13 +332,15 @@ void WhileStatement::generate_bytecode(Bytecode::Generator& generator) const generator.switch_to_basic_block(body_block); generator.begin_continuable_scope(Bytecode::Label { test_block }); m_body->generate_bytecode(generator); - generator.emit().set_targets( - Bytecode::Label { test_block }, - {}); - generator.end_continuable_scope(); + if (!generator.is_current_block_terminated()) { + generator.emit().set_targets( + Bytecode::Label { test_block }, + {}); + generator.end_continuable_scope(); - generator.switch_to_basic_block(end_block); - generator.emit(result_reg); + generator.switch_to_basic_block(end_block); + generator.emit(result_reg); + } } void DoWhileStatement::generate_bytecode(Bytecode::Generator& generator) const @@ -369,13 +374,15 @@ void DoWhileStatement::generate_bytecode(Bytecode::Generator& generator) const generator.switch_to_basic_block(body_block); generator.begin_continuable_scope(Bytecode::Label { test_block }); m_body->generate_bytecode(generator); - generator.emit().set_targets( - Bytecode::Label { test_block }, - {}); - generator.end_continuable_scope(); + if (!generator.is_current_block_terminated()) { + generator.emit().set_targets( + Bytecode::Label { test_block }, + {}); + generator.end_continuable_scope(); - generator.switch_to_basic_block(end_block); - generator.emit(result_reg); + generator.switch_to_basic_block(end_block); + generator.emit(result_reg); + } } void ForStatement::generate_bytecode(Bytecode::Generator& generator) const @@ -435,21 +442,23 @@ void ForStatement::generate_bytecode(Bytecode::Generator& generator) const m_body->generate_bytecode(generator); generator.end_continuable_scope(); - if (m_update) { + if (!generator.is_current_block_terminated()) { + if (m_update) { + generator.emit().set_targets( + Bytecode::Label { *update_block_ptr }, + {}); + + generator.switch_to_basic_block(*update_block_ptr); + m_update->generate_bytecode(generator); + } + generator.emit().set_targets( - Bytecode::Label { *update_block_ptr }, + Bytecode::Label { *test_block_ptr }, {}); - generator.switch_to_basic_block(*update_block_ptr); - m_update->generate_bytecode(generator); + generator.switch_to_basic_block(end_block); + generator.emit(result_reg); } - - generator.emit().set_targets( - Bytecode::Label { *test_block_ptr }, - {}); - - generator.switch_to_basic_block(end_block); - generator.emit(result_reg); } void ObjectExpression::generate_bytecode(Bytecode::Generator& generator) const