LibJS: Add for loop bytecode generation

This commit is contained in:
Linus Groh 2021-06-08 10:54:40 +01:00 committed by Andreas Kling
parent 50ece3dd1b
commit 68ce69db88
Notes: sideshowbarker 2024-07-18 12:38:25 +09:00
2 changed files with 26 additions and 0 deletions

View file

@ -440,6 +440,7 @@ public:
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual Optional<Bytecode::Register> generate_bytecode(Bytecode::Generator&) const override;
private:
RefPtr<ASTNode> m_init;

View file

@ -333,6 +333,31 @@ Optional<Bytecode::Register> DoWhileStatement::generate_bytecode(Bytecode::Gener
return body_result_reg;
}
Optional<Bytecode::Register> ForStatement::generate_bytecode(Bytecode::Generator& generator) const
{
Bytecode::Op::Jump* test_jump { nullptr };
if (m_init) {
[[maybe_unused]] auto init_result_reg = m_init->generate_bytecode(generator);
}
generator.begin_continuable_scope();
auto jump_label = generator.make_label();
if (m_test) {
auto test_result_reg = m_test->generate_bytecode(generator);
VERIFY(test_result_reg.has_value());
test_jump = &generator.emit<Bytecode::Op::JumpIfFalse>(*test_result_reg);
}
auto body_result_reg = m_body->generate_bytecode(generator);
if (m_update) {
[[maybe_unused]] auto update_result_reg = m_update->generate_bytecode(generator);
}
generator.emit<Bytecode::Op::Jump>(jump_label);
if (m_test)
test_jump->set_target(generator.make_label());
generator.end_continuable_scope();
return body_result_reg;
}
Optional<Bytecode::Register> ObjectExpression::generate_bytecode(Bytecode::Generator& generator) const
{
auto reg = generator.allocate_register();