1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 05:48:12 +00:00

LibJS: Implement bytecode generation for BreakStatement

This commit is contained in:
xyanrch 2021-06-10 20:28:43 +08:00 committed by Ali Mohammad Pur
parent 73cf16f643
commit a0412e0d5e
4 changed files with 31 additions and 3 deletions

View file

@ -376,13 +376,14 @@ void WhileStatement::generate_bytecode(Bytecode::Generator& generator) const
generator.switch_to_basic_block(body_block);
generator.begin_continuable_scope(Bytecode::Label { test_block });
generator.begin_breakable_scope(Bytecode::Label { end_block });
m_body->generate_bytecode(generator);
if (!generator.is_current_block_terminated()) {
generator.emit<Bytecode::Op::Jump>().set_targets(
Bytecode::Label { test_block },
{});
generator.end_continuable_scope();
generator.end_breakable_scope();
generator.switch_to_basic_block(end_block);
generator.emit<Bytecode::Op::Load>(result_reg);
}
@ -418,13 +419,14 @@ void DoWhileStatement::generate_bytecode(Bytecode::Generator& generator) const
generator.switch_to_basic_block(body_block);
generator.begin_continuable_scope(Bytecode::Label { test_block });
generator.begin_breakable_scope(Bytecode::Label { end_block });
m_body->generate_bytecode(generator);
if (!generator.is_current_block_terminated()) {
generator.emit<Bytecode::Op::Jump>().set_targets(
Bytecode::Label { test_block },
{});
generator.end_continuable_scope();
generator.end_breakable_scope();
generator.switch_to_basic_block(end_block);
generator.emit<Bytecode::Op::Load>(result_reg);
}
@ -484,6 +486,7 @@ void ForStatement::generate_bytecode(Bytecode::Generator& generator) const
generator.switch_to_basic_block(*body_block_ptr);
generator.begin_continuable_scope(Bytecode::Label { *update_block_ptr });
generator.begin_breakable_scope(Bytecode::Label { end_block });
m_body->generate_bytecode(generator);
generator.end_continuable_scope();
@ -501,6 +504,7 @@ void ForStatement::generate_bytecode(Bytecode::Generator& generator) const
Bytecode::Label { *test_block_ptr },
{});
generator.end_breakable_scope();
generator.switch_to_basic_block(end_block);
generator.emit<Bytecode::Op::Load>(result_reg);
}
@ -787,4 +791,11 @@ void ThrowStatement::generate_bytecode(Bytecode::Generator& generator) const
generator.emit<Bytecode::Op::Throw>();
}
void BreakStatement::generate_bytecode(Bytecode::Generator& generator) const
{
generator.emit<Bytecode::Op::Jump>().set_targets(
generator.nearest_breakable_scope(),
{});
}
}