Ver código fonte

LibJS: Fix evaluation order for tagged template literals

This ensures that the tag function is evaluated first.
Gunnar Beutner 4 anos atrás
pai
commit
9dc9ddbf82
1 arquivos alterados com 4 adições e 4 exclusões
  1. 4 4
      Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp

+ 4 - 4
Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp

@@ -655,6 +655,10 @@ void TemplateLiteral::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;
     auto& expressions = m_template_literal->expressions();
     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::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());
     auto this_reg = generator.allocate_register();
     generator.emit<Bytecode::Op::Store>(this_reg);