diff --git a/Userland/Libraries/LibJS/AST.h b/Userland/Libraries/LibJS/AST.h index 9b84e6d74f..a2efbcdea9 100644 --- a/Userland/Libraries/LibJS/AST.h +++ b/Userland/Libraries/LibJS/AST.h @@ -1092,6 +1092,7 @@ public: virtual Value execute(Interpreter&, GlobalObject&) const override; virtual void dump(int indent) const override; + virtual Optional generate_bytecode(Bytecode::Generator&) const override; const NonnullRefPtrVector& expressions() const { return m_expressions; } const NonnullRefPtrVector& raw_strings() const { return m_raw_strings; } diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index bd8363e4de..5a26fa6cdf 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -478,4 +478,24 @@ Optional SequenceExpression::generate_bytecode(Bytecode::Gen return last_reg; } +Optional TemplateLiteral::generate_bytecode(Bytecode::Generator& generator) const +{ + Optional result_reg; + + for (auto& expression : m_expressions) { + auto expr_reg = expression.generate_bytecode(generator); + if (!result_reg.has_value()) + result_reg = expr_reg; + else + generator.emit(*result_reg, *result_reg, *expr_reg); + } + + if (!result_reg.has_value()) { + result_reg = generator.allocate_register(); + generator.emit(*result_reg, ""); + } + + return result_reg; +} + }