From 8f535435dcf401f029124410ee6f3a7d167f1a9a Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 13 Oct 2020 23:53:02 +0200 Subject: [PATCH] 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 :^) --- Libraries/LibJS/Runtime/Object.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Libraries/LibJS/Runtime/Object.cpp b/Libraries/LibJS/Runtime/Object.cpp index aefef76a64..72ad7149dc 100644 --- a/Libraries/LibJS/Runtime/Object.cpp +++ b/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();