LibJS: Add bytecode generation for simple ObjectExpressions

Bytecode is now generated for object literals which only contain simple
key-value pairs (i.e. no spread, getters or setters)
This commit is contained in:
Gal Horowitz 2021-06-11 19:40:48 +03:00 committed by Andreas Kling
parent e0fb36aad7
commit b47d117bd2
Notes: sideshowbarker 2024-07-18 12:23:49 +09:00

View File

@ -560,9 +560,33 @@ void ForStatement::generate_bytecode(Bytecode::Generator& generator) const
void ObjectExpression::generate_bytecode(Bytecode::Generator& generator) const
{
generator.emit<Bytecode::Op::NewObject>();
if (m_properties.is_empty())
return;
if (!m_properties.is_empty())
auto object_reg = generator.allocate_register();
generator.emit<Bytecode::Op::Store>(object_reg);
for (auto& property : m_properties) {
if (property.type() != ObjectProperty::Type::KeyValue)
TODO();
if (is<StringLiteral>(property.key())) {
auto& string_literal = static_cast<StringLiteral const&>(property.key());
Bytecode::StringTableIndex key_name = generator.intern_string(string_literal.value());
property.value().generate_bytecode(generator);
generator.emit<Bytecode::Op::PutById>(object_reg, key_name);
} else {
property.key().generate_bytecode(generator);
auto property_reg = generator.allocate_register();
generator.emit<Bytecode::Op::Store>(property_reg);
property.value().generate_bytecode(generator);
generator.emit<Bytecode::Op::PutByValue>(object_reg, property_reg);
}
}
generator.emit<Bytecode::Op::Load>(object_reg);
}
void ArrayExpression::generate_bytecode(Bytecode::Generator& generator) const