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

LibJS: Don't generate code after we've encountered a terminating op

This commit is contained in:
Gunnar Beutner 2021-06-09 19:57:18 +02:00 committed by Andreas Kling
parent d198e41f74
commit 6af7e74a25

View file

@ -23,8 +23,11 @@ void ASTNode::generate_bytecode(Bytecode::Generator&) const
void ScopeNode::generate_bytecode(Bytecode::Generator& generator) const
{
generator.emit<Bytecode::Op::EnterScope>(*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,6 +332,7 @@ 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);
if (!generator.is_current_block_terminated()) {
generator.emit<Bytecode::Op::Jump>().set_targets(
Bytecode::Label { test_block },
{});
@ -337,6 +341,7 @@ void WhileStatement::generate_bytecode(Bytecode::Generator& generator) const
generator.switch_to_basic_block(end_block);
generator.emit<Bytecode::Op::Load>(result_reg);
}
}
void DoWhileStatement::generate_bytecode(Bytecode::Generator& generator) const
{
@ -369,6 +374,7 @@ 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);
if (!generator.is_current_block_terminated()) {
generator.emit<Bytecode::Op::Jump>().set_targets(
Bytecode::Label { test_block },
{});
@ -377,6 +383,7 @@ void DoWhileStatement::generate_bytecode(Bytecode::Generator& generator) const
generator.switch_to_basic_block(end_block);
generator.emit<Bytecode::Op::Load>(result_reg);
}
}
void ForStatement::generate_bytecode(Bytecode::Generator& generator) const
{
@ -435,6 +442,7 @@ void ForStatement::generate_bytecode(Bytecode::Generator& generator) const
m_body->generate_bytecode(generator);
generator.end_continuable_scope();
if (!generator.is_current_block_terminated()) {
if (m_update) {
generator.emit<Bytecode::Op::Jump>().set_targets(
Bytecode::Label { *update_block_ptr },
@ -451,6 +459,7 @@ void ForStatement::generate_bytecode(Bytecode::Generator& generator) const
generator.switch_to_basic_block(end_block);
generator.emit<Bytecode::Op::Load>(result_reg);
}
}
void ObjectExpression::generate_bytecode(Bytecode::Generator& generator) const
{