Преглед на файлове

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)
Gal Horowitz преди 4 години
родител
ревизия
b47d117bd2
променени са 1 файла, в които са добавени 26 реда и са изтрити 2 реда
  1. 26 2
      Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp

+ 26 - 2
Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp

@@ -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())
-        TODO();
+    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