1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 06:58:11 +00:00

LibJS: Support calling result of a computed MemberExpression in bytecode

This patch adds support for calls of the form o.f[expr]()
This commit is contained in:
Andreas Kling 2021-10-25 16:05:04 +02:00
parent a2a8b97c11
commit 5599d22744

View file

@ -873,11 +873,13 @@ void CallExpression::generate_bytecode(Bytecode::Generator& generator) const
} else {
member_expression.object().generate_bytecode(generator);
generator.emit<Bytecode::Op::Store>(this_reg);
// FIXME: Don't copy this logic here, make MemberExpression generate it.
if (!is<Identifier>(member_expression.property()))
TODO();
auto identifier_table_ref = generator.intern_identifier(static_cast<Identifier const&>(member_expression.property()).string());
generator.emit<Bytecode::Op::GetById>(identifier_table_ref);
if (member_expression.is_computed()) {
member_expression.property().generate_bytecode(generator);
generator.emit<Bytecode::Op::GetByValue>(this_reg);
} else {
auto identifier_table_ref = generator.intern_identifier(verify_cast<Identifier>(member_expression.property()).string());
generator.emit<Bytecode::Op::GetById>(identifier_table_ref);
}
generator.emit<Bytecode::Op::Store>(callee_reg);
}
} else {