mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-30 08:41:15 +00:00
LibJS: Add for loop bytecode generation
This commit is contained in:
parent
50ece3dd1b
commit
68ce69db88
Notes:
sideshowbarker
2024-07-18 12:38:25 +09:00
Author: https://github.com/linusg Commit: https://github.com/SerenityOS/serenity/commit/68ce69db88d Pull-request: https://github.com/SerenityOS/serenity/pull/7913
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue