mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 11:18:11 +00:00
LibJS: Make sure that if expressions yield the correct value
When evaluated as an expression "if (true) { 3 } else { 5 }" should yield 3. This updates the bytecode interpreter to make it so.
This commit is contained in:
parent
2c10bd72f2
commit
93eae063a1
4 changed files with 34 additions and 5 deletions
|
@ -344,24 +344,25 @@ Optional<Bytecode::Register> ReturnStatement::generate_bytecode(Bytecode::Genera
|
|||
|
||||
Optional<Bytecode::Register> IfStatement::generate_bytecode(Bytecode::Generator& generator) const
|
||||
{
|
||||
auto result_reg = generator.allocate_register();
|
||||
auto predicate_reg = m_predicate->generate_bytecode(generator);
|
||||
auto& if_jump = generator.emit<Bytecode::Op::JumpIfTrue>(*predicate_reg);
|
||||
auto& else_jump = generator.emit<Bytecode::Op::JumpIfFalse>(*predicate_reg);
|
||||
|
||||
if_jump.set_target(generator.make_label());
|
||||
(void)m_consequent->generate_bytecode(generator);
|
||||
auto consequent_reg = m_consequent->generate_bytecode(generator);
|
||||
generator.emit<Bytecode::Op::LoadRegister>(result_reg, *consequent_reg);
|
||||
auto& end_jump = generator.emit<Bytecode::Op::Jump>();
|
||||
|
||||
else_jump.set_target(generator.make_label());
|
||||
if (m_alternate) {
|
||||
(void)m_alternate->generate_bytecode(generator);
|
||||
auto alternative_reg = m_alternate->generate_bytecode(generator);
|
||||
generator.emit<Bytecode::Op::LoadRegister>(result_reg, *alternative_reg);
|
||||
}
|
||||
|
||||
end_jump.set_target(generator.make_label());
|
||||
|
||||
// FIXME: Do we need IfStatement to return the consequent/alternate result value?
|
||||
// (That's what the AST interpreter currently does)
|
||||
return {};
|
||||
return result_reg;
|
||||
}
|
||||
|
||||
Optional<Bytecode::Register> ContinueStatement::generate_bytecode(Bytecode::Generator& generator) const
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue