mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 21:57:35 +00:00
LibJS: Make sure loop results are initialized
This ensures that "while", do...while, "for" expressions have a properly initialized result value even if the user terminated the loop body via break or the loop body wasn't executed at all.
This commit is contained in:
parent
624ceec04f
commit
5ff85abe8c
1 changed files with 12 additions and 0 deletions
|
@ -279,24 +279,32 @@ void AssignmentExpression::generate_bytecode(Bytecode::Generator& generator) con
|
||||||
|
|
||||||
void WhileStatement::generate_bytecode(Bytecode::Generator& generator) const
|
void WhileStatement::generate_bytecode(Bytecode::Generator& generator) const
|
||||||
{
|
{
|
||||||
|
generator.emit<Bytecode::Op::LoadImmediate>(js_undefined());
|
||||||
generator.begin_continuable_scope();
|
generator.begin_continuable_scope();
|
||||||
auto test_label = generator.make_label();
|
auto test_label = generator.make_label();
|
||||||
|
auto result_reg = generator.allocate_register();
|
||||||
|
generator.emit<Bytecode::Op::Store>(result_reg);
|
||||||
m_test->generate_bytecode(generator);
|
m_test->generate_bytecode(generator);
|
||||||
auto& test_jump = generator.emit<Bytecode::Op::JumpIfFalse>();
|
auto& test_jump = generator.emit<Bytecode::Op::JumpIfFalse>();
|
||||||
m_body->generate_bytecode(generator);
|
m_body->generate_bytecode(generator);
|
||||||
generator.emit<Bytecode::Op::Jump>(test_label);
|
generator.emit<Bytecode::Op::Jump>(test_label);
|
||||||
test_jump.set_target(generator.make_label());
|
test_jump.set_target(generator.make_label());
|
||||||
generator.end_continuable_scope();
|
generator.end_continuable_scope();
|
||||||
|
generator.emit<Bytecode::Op::Load>(result_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DoWhileStatement::generate_bytecode(Bytecode::Generator& generator) const
|
void DoWhileStatement::generate_bytecode(Bytecode::Generator& generator) const
|
||||||
{
|
{
|
||||||
|
generator.emit<Bytecode::Op::LoadImmediate>(js_undefined());
|
||||||
generator.begin_continuable_scope();
|
generator.begin_continuable_scope();
|
||||||
auto head_label = generator.make_label();
|
auto head_label = generator.make_label();
|
||||||
m_body->generate_bytecode(generator);
|
m_body->generate_bytecode(generator);
|
||||||
generator.end_continuable_scope();
|
generator.end_continuable_scope();
|
||||||
|
auto result_reg = generator.allocate_register();
|
||||||
|
generator.emit<Bytecode::Op::Store>(result_reg);
|
||||||
m_test->generate_bytecode(generator);
|
m_test->generate_bytecode(generator);
|
||||||
generator.emit<Bytecode::Op::JumpIfTrue>(head_label);
|
generator.emit<Bytecode::Op::JumpIfTrue>(head_label);
|
||||||
|
generator.emit<Bytecode::Op::Load>(result_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ForStatement::generate_bytecode(Bytecode::Generator& generator) const
|
void ForStatement::generate_bytecode(Bytecode::Generator& generator) const
|
||||||
|
@ -306,8 +314,11 @@ void ForStatement::generate_bytecode(Bytecode::Generator& generator) const
|
||||||
if (m_init)
|
if (m_init)
|
||||||
m_init->generate_bytecode(generator);
|
m_init->generate_bytecode(generator);
|
||||||
|
|
||||||
|
generator.emit<Bytecode::Op::LoadImmediate>(js_undefined());
|
||||||
generator.begin_continuable_scope();
|
generator.begin_continuable_scope();
|
||||||
auto jump_label = generator.make_label();
|
auto jump_label = generator.make_label();
|
||||||
|
auto result_reg = generator.allocate_register();
|
||||||
|
generator.emit<Bytecode::Op::Store>(result_reg);
|
||||||
if (m_test) {
|
if (m_test) {
|
||||||
m_test->generate_bytecode(generator);
|
m_test->generate_bytecode(generator);
|
||||||
test_jump = &generator.emit<Bytecode::Op::JumpIfFalse>();
|
test_jump = &generator.emit<Bytecode::Op::JumpIfFalse>();
|
||||||
|
@ -320,6 +331,7 @@ void ForStatement::generate_bytecode(Bytecode::Generator& generator) const
|
||||||
if (m_test)
|
if (m_test)
|
||||||
test_jump->set_target(generator.make_label());
|
test_jump->set_target(generator.make_label());
|
||||||
generator.end_continuable_scope();
|
generator.end_continuable_scope();
|
||||||
|
generator.emit<Bytecode::Op::Load>(result_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectExpression::generate_bytecode(Bytecode::Generator& generator) const
|
void ObjectExpression::generate_bytecode(Bytecode::Generator& generator) const
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue