mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-21 02:08:12 +03:00
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:
parent
e0fb36aad7
commit
b47d117bd2
Notes:
sideshowbarker
2024-07-18 12:23:49 +09:00
Author: https://github.com/GalHorowitz Commit: https://github.com/SerenityOS/serenity/commit/b47d117bd25 Pull-request: https://github.com/SerenityOS/serenity/pull/7996
@ -560,9 +560,33 @@ void ForStatement::generate_bytecode(Bytecode::Generator& generator) const
|
|||||||
void ObjectExpression::generate_bytecode(Bytecode::Generator& generator) const
|
void ObjectExpression::generate_bytecode(Bytecode::Generator& generator) const
|
||||||
{
|
{
|
||||||
generator.emit<Bytecode::Op::NewObject>();
|
generator.emit<Bytecode::Op::NewObject>();
|
||||||
|
if (m_properties.is_empty())
|
||||||
|
return;
|
||||||
|
|
||||||
if (!m_properties.is_empty())
|
auto object_reg = generator.allocate_register();
|
||||||
TODO();
|
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
|
void ArrayExpression::generate_bytecode(Bytecode::Generator& generator) const
|
||||||
|
Loading…
Reference in New Issue
Block a user