Prechádzať zdrojové kódy

LibJS/Bytecode: Inline indexed property access in GetByVal better

Andreas Kling 1 rok pred
rodič
commit
161298b5d1

+ 6 - 1
Userland/Libraries/LibJS/Bytecode/CommonImplementations.h

@@ -168,7 +168,12 @@ inline ThrowCompletionOr<Value> get_by_value(VM& vm, Optional<DeprecatedFlyStrin
         // For "non-typed arrays":
         if (!object.may_interfere_with_indexed_property_access()
             && object_storage) {
-            auto maybe_value = object_storage->get(index);
+            auto maybe_value = [&] {
+                if (object_storage->is_simple_storage())
+                    return static_cast<SimpleIndexedPropertyStorage const*>(object_storage)->inline_get(index);
+                else
+                    return static_cast<GenericIndexedPropertyStorage const*>(object_storage)->get(index);
+            }();
             if (maybe_value.has_value()) {
                 auto value = maybe_value->value;
                 if (!value.is_accessor())

+ 2 - 4
Userland/Libraries/LibJS/Runtime/IndexedProperties.cpp

@@ -22,14 +22,12 @@ SimpleIndexedPropertyStorage::SimpleIndexedPropertyStorage(Vector<Value>&& initi
 
 bool SimpleIndexedPropertyStorage::has_index(u32 index) const
 {
-    return index < m_array_size && !m_packed_elements[index].is_empty();
+    return inline_has_index(index);
 }
 
 Optional<ValueAndAttributes> SimpleIndexedPropertyStorage::get(u32 index) const
 {
-    if (!has_index(index))
-        return {};
-    return ValueAndAttributes { m_packed_elements[index], default_attributes };
+    return inline_get(index);
 }
 
 void SimpleIndexedPropertyStorage::grow_storage_if_needed()

+ 12 - 0
Userland/Libraries/LibJS/Runtime/IndexedProperties.h

@@ -74,6 +74,18 @@ public:
 
     Vector<Value> const& elements() const { return m_packed_elements; }
 
+    [[nodiscard]] bool inline_has_index(u32 index) const
+    {
+        return index < m_array_size && !m_packed_elements.data()[index].is_empty();
+    }
+
+    [[nodiscard]] Optional<ValueAndAttributes> inline_get(u32 index) const
+    {
+        if (!inline_has_index(index))
+            return {};
+        return ValueAndAttributes { m_packed_elements.data()[index], default_attributes };
+    }
+
 private:
     friend GenericIndexedPropertyStorage;