mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:47:36 +00:00
LibJS: Append first sparse element to packed elements in take_first()
Otherwise we continuously lose the first sparse element (at index SPARSE_ARRAY_THRESHOLD) without noticing, as we overwrite all indices with the value at index+1. Fixes #5884.
This commit is contained in:
parent
611b3c2c49
commit
ae95ed5ddd
2 changed files with 20 additions and 3 deletions
|
@ -180,14 +180,19 @@ ValueAndAttributes GenericIndexedPropertyStorage::take_first()
|
|||
VERIFY(m_array_size > 0);
|
||||
m_array_size--;
|
||||
|
||||
auto first_element = m_packed_elements.take_first();
|
||||
|
||||
if (!m_sparse_elements.is_empty()) {
|
||||
m_packed_elements.append(m_sparse_elements.get(SPARSE_ARRAY_THRESHOLD).value_or({}));
|
||||
HashMap<u32, ValueAndAttributes> new_sparse_elements;
|
||||
for (auto& entry : m_sparse_elements)
|
||||
new_sparse_elements.set(entry.key - 1, entry.value);
|
||||
for (auto& entry : m_sparse_elements) {
|
||||
if (entry.key - 1 >= SPARSE_ARRAY_THRESHOLD)
|
||||
new_sparse_elements.set(entry.key - 1, entry.value);
|
||||
}
|
||||
m_sparse_elements = move(new_sparse_elements);
|
||||
}
|
||||
|
||||
return m_packed_elements.take_first();
|
||||
return first_element;
|
||||
}
|
||||
|
||||
ValueAndAttributes GenericIndexedPropertyStorage::take_last()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue