From de3ee701cece9e357bc80bca1c3aeade1a5bd470 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 8 Jun 2021 04:54:34 +0100 Subject: [PATCH] LibJS: Add conditional expression bytecode generation Or, by its more common name, the ternary operator :^) --- Userland/Libraries/LibJS/AST.h | 1 + .../Libraries/LibJS/Bytecode/ASTCodegen.cpp | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/Userland/Libraries/LibJS/AST.h b/Userland/Libraries/LibJS/AST.h index 8a10cd9fc4..582a083f01 100644 --- a/Userland/Libraries/LibJS/AST.h +++ b/Userland/Libraries/LibJS/AST.h @@ -1176,6 +1176,7 @@ public: virtual void dump(int indent) const override; virtual Value execute(Interpreter&, GlobalObject&) const override; + virtual Optional generate_bytecode(Bytecode::Generator&) const override; private: NonnullRefPtr m_test; diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 7c808aaee7..53adfbc530 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -430,4 +430,23 @@ Optional DebuggerStatement::generate_bytecode(Bytecode::Gene return {}; } +Optional ConditionalExpression::generate_bytecode(Bytecode::Generator& generator) const +{ + auto result_reg = generator.allocate_register(); + auto test_reg = m_test->generate_bytecode(generator); + auto& alternate_jump = generator.emit(*test_reg); + + auto consequent_reg = m_consequent->generate_bytecode(generator); + generator.emit(result_reg, *consequent_reg); + auto& end_jump = generator.emit(); + + alternate_jump.set_target(generator.make_label()); + auto alternative_reg = m_alternate->generate_bytecode(generator); + generator.emit(result_reg, *alternative_reg); + + end_jump.set_target(generator.make_label()); + + return result_reg; +} + }