1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 06:17:35 +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 void ScopeNode::generate_bytecode(Bytecode::Generator& generator) const
{ {
generator.emit<Bytecode::Op::EnterScope>(*this); generator.emit<Bytecode::Op::EnterScope>(*this);
for (auto& child : children()) for (auto& child : children()) {
child.generate_bytecode(generator); child.generate_bytecode(generator);
if (generator.is_current_block_terminated())
break;
}
} }
void EmptyStatement::generate_bytecode(Bytecode::Generator&) const 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.switch_to_basic_block(body_block);
generator.begin_continuable_scope(Bytecode::Label { test_block }); generator.begin_continuable_scope(Bytecode::Label { test_block });
m_body->generate_bytecode(generator); m_body->generate_bytecode(generator);
if (!generator.is_current_block_terminated()) {
generator.emit<Bytecode::Op::Jump>().set_targets( generator.emit<Bytecode::Op::Jump>().set_targets(
Bytecode::Label { test_block }, Bytecode::Label { test_block },
{}); {});
@ -337,6 +341,7 @@ void WhileStatement::generate_bytecode(Bytecode::Generator& generator) const
generator.switch_to_basic_block(end_block); generator.switch_to_basic_block(end_block);
generator.emit<Bytecode::Op::Load>(result_reg); generator.emit<Bytecode::Op::Load>(result_reg);
} }
}
void DoWhileStatement::generate_bytecode(Bytecode::Generator& generator) const 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.switch_to_basic_block(body_block);
generator.begin_continuable_scope(Bytecode::Label { test_block }); generator.begin_continuable_scope(Bytecode::Label { test_block });
m_body->generate_bytecode(generator); m_body->generate_bytecode(generator);
if (!generator.is_current_block_terminated()) {
generator.emit<Bytecode::Op::Jump>().set_targets( generator.emit<Bytecode::Op::Jump>().set_targets(
Bytecode::Label { test_block }, Bytecode::Label { test_block },
{}); {});
@ -377,6 +383,7 @@ void DoWhileStatement::generate_bytecode(Bytecode::Generator& generator) const
generator.switch_to_basic_block(end_block); generator.switch_to_basic_block(end_block);
generator.emit<Bytecode::Op::Load>(result_reg); generator.emit<Bytecode::Op::Load>(result_reg);
} }
}
void ForStatement::generate_bytecode(Bytecode::Generator& generator) const 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); m_body->generate_bytecode(generator);
generator.end_continuable_scope(); generator.end_continuable_scope();
if (!generator.is_current_block_terminated()) {
if (m_update) { if (m_update) {
generator.emit<Bytecode::Op::Jump>().set_targets( generator.emit<Bytecode::Op::Jump>().set_targets(
Bytecode::Label { *update_block_ptr }, 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.switch_to_basic_block(end_block);
generator.emit<Bytecode::Op::Load>(result_reg); generator.emit<Bytecode::Op::Load>(result_reg);
} }
}
void ObjectExpression::generate_bytecode(Bytecode::Generator& generator) const void ObjectExpression::generate_bytecode(Bytecode::Generator& generator) const
{ {