mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 22:57:44 +00:00
LibJS: Add for loop bytecode generation
This commit is contained in:
parent
50ece3dd1b
commit
68ce69db88
2 changed files with 26 additions and 0 deletions
|
@ -440,6 +440,7 @@ public:
|
||||||
|
|
||||||
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
virtual Optional<Bytecode::Register> generate_bytecode(Bytecode::Generator&) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RefPtr<ASTNode> m_init;
|
RefPtr<ASTNode> m_init;
|
||||||
|
|
|
@ -333,6 +333,31 @@ Optional<Bytecode::Register> DoWhileStatement::generate_bytecode(Bytecode::Gener
|
||||||
return body_result_reg;
|
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
|
Optional<Bytecode::Register> ObjectExpression::generate_bytecode(Bytecode::Generator& generator) const
|
||||||
{
|
{
|
||||||
auto reg = generator.allocate_register();
|
auto reg = generator.allocate_register();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue