Explorar o código

LibJS: Avoid property lookups during object initialization

When we're initializing objects, we're just adding a bunch of new
properties, without transition, and without overlap (we never add
the same property twice.)

Take advantage of this by skipping lookups entirely (no need to see
if we're overwriting an existing property) during initialization.

Another nice test-js speedup :^)
Andreas Kling %!s(int64=4) %!d(string=hai) anos
pai
achega
8f535435dc
Modificáronse 1 ficheiros con 9 adicións e 0 borrados
  1. 9 0
      Libraries/LibJS/Runtime/Object.cpp

+ 9 - 0
Libraries/LibJS/Runtime/Object.cpp

@@ -472,6 +472,15 @@ bool Object::put_own_property(Object& this_object, const StringOrSymbol& propert
             attributes.set_has_setter();
     }
 
+    // NOTE: We disable transitions during initialize(), this makes building common runtime objects significantly faster.
+    //       Transitions are primarily interesting when scripts add properties to objects.
+    if (!m_transitions_enabled && !m_shape->is_unique()) {
+        m_shape->add_property_without_transition(property_name, attributes);
+        m_storage.resize(m_shape->property_count());
+        m_storage[m_shape->property_count() - 1] = value;
+        return true;
+    }
+
     auto metadata = shape().lookup(property_name);
     bool new_property = !metadata.has_value();