mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-27 06:48:49 +00:00
LibJS: Generate bytecode for tagged template literals
This commit is contained in:
parent
25ab31219c
commit
2d48fe894f
Notes:
sideshowbarker
2024-07-18 12:31:19 +09:00
Author: https://github.com/gunnarbeutner
Commit: 2d48fe894f
Pull-request: https://github.com/SerenityOS/serenity/pull/7958
2 changed files with 57 additions and 0 deletions
|
@ -653,6 +653,62 @@ void TemplateLiteral::generate_bytecode(Bytecode::Generator& generator) const
|
|||
generator.emit<Bytecode::Op::Load>(string_reg);
|
||||
}
|
||||
|
||||
void TaggedTemplateLiteral::generate_bytecode(Bytecode::Generator& generator) const
|
||||
{
|
||||
Vector<Bytecode::Register> string_regs;
|
||||
auto& expressions = m_template_literal->expressions();
|
||||
for (size_t i = 0; i < expressions.size(); ++i) {
|
||||
if (i % 2 != 0)
|
||||
continue;
|
||||
|
||||
expressions[i].generate_bytecode(generator);
|
||||
auto string_reg = generator.allocate_register();
|
||||
generator.emit<Bytecode::Op::Store>(string_reg);
|
||||
string_regs.append(string_reg);
|
||||
}
|
||||
|
||||
generator.emit_with_extra_register_slots<Bytecode::Op::NewArray>(string_regs.size(), string_regs);
|
||||
auto strings_reg = generator.allocate_register();
|
||||
generator.emit<Bytecode::Op::Store>(strings_reg);
|
||||
|
||||
Vector<Bytecode::Register> argument_regs;
|
||||
argument_regs.append(strings_reg);
|
||||
for (size_t i = 0; i < expressions.size(); ++i) {
|
||||
if (i % 2 == 0)
|
||||
continue;
|
||||
|
||||
expressions[i].generate_bytecode(generator);
|
||||
auto string_reg = generator.allocate_register();
|
||||
generator.emit<Bytecode::Op::Store>(string_reg);
|
||||
argument_regs.append(string_reg);
|
||||
}
|
||||
|
||||
Vector<Bytecode::Register> raw_string_regs;
|
||||
for (auto& raw_string : m_template_literal->raw_strings()) {
|
||||
raw_string.generate_bytecode(generator);
|
||||
auto raw_string_reg = generator.allocate_register();
|
||||
generator.emit<Bytecode::Op::Store>(raw_string_reg);
|
||||
raw_string_regs.append(raw_string_reg);
|
||||
}
|
||||
|
||||
generator.emit_with_extra_register_slots<Bytecode::Op::NewArray>(raw_string_regs.size(), raw_string_regs);
|
||||
auto raw_strings_reg = generator.allocate_register();
|
||||
generator.emit<Bytecode::Op::Store>(raw_strings_reg);
|
||||
|
||||
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);
|
||||
|
||||
generator.emit_with_extra_register_slots<Bytecode::Op::Call>(argument_regs.size(), tag_reg, this_reg, move(argument_regs));
|
||||
}
|
||||
|
||||
void UpdateExpression::generate_bytecode(Bytecode::Generator& generator) const
|
||||
{
|
||||
if (is<Identifier>(*m_argument)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue