mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 20:47:45 +00:00
LibJS: Add an explicit DataBlock::size method
This avoids visiting the underlying buffer twice from ArrayBuffer's byte_length. On https://cyxx.github.io/another_js, this reduces the runtime of IsValidIntegerIndex from 9.9% to 8.9%.
This commit is contained in:
parent
72cee4c88b
commit
17e2f751c5
1 changed files with 9 additions and 7 deletions
|
@ -42,6 +42,14 @@ struct DataBlock {
|
||||||
}
|
}
|
||||||
ByteBuffer const& buffer() const { return const_cast<DataBlock*>(this)->buffer(); }
|
ByteBuffer const& buffer() const { return const_cast<DataBlock*>(this)->buffer(); }
|
||||||
|
|
||||||
|
size_t size() const
|
||||||
|
{
|
||||||
|
return byte_buffer.visit(
|
||||||
|
[](Empty) -> size_t { return 0u; },
|
||||||
|
[](ByteBuffer const& buffer) { return buffer.size(); },
|
||||||
|
[](ByteBuffer const* buffer) { return buffer->size(); });
|
||||||
|
}
|
||||||
|
|
||||||
Variant<Empty, ByteBuffer, ByteBuffer*> byte_buffer;
|
Variant<Empty, ByteBuffer, ByteBuffer*> byte_buffer;
|
||||||
Shared is_shared = { Shared::No };
|
Shared is_shared = { Shared::No };
|
||||||
};
|
};
|
||||||
|
@ -57,13 +65,7 @@ public:
|
||||||
|
|
||||||
virtual ~ArrayBuffer() override = default;
|
virtual ~ArrayBuffer() override = default;
|
||||||
|
|
||||||
size_t byte_length() const
|
size_t byte_length() const { return m_data_block.size(); }
|
||||||
{
|
|
||||||
if (is_detached())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return m_data_block.buffer().size();
|
|
||||||
}
|
|
||||||
|
|
||||||
// [[ArrayBufferData]]
|
// [[ArrayBufferData]]
|
||||||
ByteBuffer& buffer() { return m_data_block.buffer(); }
|
ByteBuffer& buffer() { return m_data_block.buffer(); }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue