LibJS: Fix evaluation order for tagged template literals

This ensures that the tag function is evaluated first.
This commit is contained in:
Gunnar Beutner 2021-06-09 22:07:18 +02:00 committed by Andreas Kling
parent 2d48fe894f
commit 9dc9ddbf82
Notes: sideshowbarker 2024-07-18 12:31:15 +09:00

View file

@ -655,6 +655,10 @@ void TemplateLiteral::generate_bytecode(Bytecode::Generator& generator) const
void TaggedTemplateLiteral::generate_bytecode(Bytecode::Generator& generator) const void TaggedTemplateLiteral::generate_bytecode(Bytecode::Generator& generator) const
{ {
m_tag->generate_bytecode(generator);
auto tag_reg = generator.allocate_register();
generator.emit<Bytecode::Op::Store>(tag_reg);
Vector<Bytecode::Register> string_regs; Vector<Bytecode::Register> string_regs;
auto& expressions = m_template_literal->expressions(); auto& expressions = m_template_literal->expressions();
for (size_t i = 0; i < expressions.size(); ++i) { for (size_t i = 0; i < expressions.size(); ++i) {
@ -698,10 +702,6 @@ void TaggedTemplateLiteral::generate_bytecode(Bytecode::Generator& generator) co
generator.emit<Bytecode::Op::Load>(strings_reg); generator.emit<Bytecode::Op::Load>(strings_reg);
generator.emit<Bytecode::Op::PutById>(raw_strings_reg, generator.intern_string("raw")); generator.emit<Bytecode::Op::PutById>(raw_strings_reg, generator.intern_string("raw"));
m_tag->generate_bytecode(generator);
auto tag_reg = generator.allocate_register();
generator.emit<Bytecode::Op::Store>(tag_reg);
generator.emit<Bytecode::Op::LoadImmediate>(js_undefined()); generator.emit<Bytecode::Op::LoadImmediate>(js_undefined());
auto this_reg = generator.allocate_register(); auto this_reg = generator.allocate_register();
generator.emit<Bytecode::Op::Store>(this_reg); generator.emit<Bytecode::Op::Store>(this_reg);