LibJS/Bytecode: Inline indexed property access in GetByVal better

This commit is contained in:
Andreas Kling 2024-05-07 12:28:59 +02:00
commit 161298b5d1
Notes: sideshowbarker 2024-07-17 03:16:02 +09:00
3 changed files with 20 additions and 5 deletions

View file

@ -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())

View file

@ -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()

View file

@ -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;