mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-25 17:25:08 +02:00
AK: Initialize StringBuilder buffer in place
Before this change, we'd construct a ByteBuffer for the internal buffer, and then move-construct StringBuilder::m_buffer from it. Due to ByteBuffer's inline capacity, this meant we had to memmove the inline buffer an extra time for every StringBuilder created.
This commit is contained in:
committed by
Andreas Kling
parent
1ec72de0a6
commit
72ea158f16
Notes:
github-actions[bot]
2025-10-05 09:25:55 +00:00
Author: https://github.com/awesomekling Commit: https://github.com/LadybirdBrowser/ladybird/commit/72ea158f168 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/6396
@@ -34,16 +34,12 @@ static constexpr size_t string_builder_prefix_size(StringBuilder::Mode mode)
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
static ErrorOr<StringBuilder::Buffer> create_buffer(StringBuilder::Mode mode, size_t capacity)
|
||||
void StringBuilder::initialize_buffer(Mode mode, size_t capacity)
|
||||
{
|
||||
StringBuilder::Buffer buffer;
|
||||
auto prefix_size = string_builder_prefix_size(mode);
|
||||
|
||||
if (capacity > StringBuilder::inline_capacity)
|
||||
TRY(buffer.try_ensure_capacity(prefix_size + capacity));
|
||||
|
||||
TRY(buffer.try_resize(prefix_size));
|
||||
return buffer;
|
||||
m_buffer.ensure_capacity(prefix_size + capacity);
|
||||
m_buffer.resize(prefix_size);
|
||||
}
|
||||
|
||||
StringBuilder::StringBuilder()
|
||||
@@ -51,24 +47,24 @@ StringBuilder::StringBuilder()
|
||||
static constexpr auto prefix_size = string_builder_prefix_size(DEFAULT_MODE);
|
||||
static_assert(inline_capacity > prefix_size);
|
||||
|
||||
m_buffer.resize(prefix_size);
|
||||
initialize_buffer(m_mode, inline_capacity);
|
||||
}
|
||||
|
||||
StringBuilder::StringBuilder(size_t initial_capacity)
|
||||
: m_buffer(MUST(create_buffer(DEFAULT_MODE, initial_capacity)))
|
||||
{
|
||||
initialize_buffer(m_mode, initial_capacity);
|
||||
}
|
||||
|
||||
StringBuilder::StringBuilder(Mode mode)
|
||||
: m_buffer(MUST(create_buffer(mode, inline_capacity)))
|
||||
, m_mode(mode)
|
||||
: m_mode(mode)
|
||||
{
|
||||
initialize_buffer(m_mode, inline_capacity);
|
||||
}
|
||||
|
||||
StringBuilder::StringBuilder(Mode mode, size_t initial_capacity_in_code_units)
|
||||
: m_buffer(MUST(create_buffer(mode, initial_capacity_in_code_units * (mode == Mode::UTF8 ? 1 : 2))))
|
||||
, m_mode(mode)
|
||||
: m_mode(mode)
|
||||
{
|
||||
initialize_buffer(mode, initial_capacity_in_code_units * (mode == Mode::UTF8 ? 1 : 2));
|
||||
}
|
||||
|
||||
inline ErrorOr<void> StringBuilder::will_append(size_t size_in_bytes)
|
||||
|
||||
@@ -119,6 +119,8 @@ public:
|
||||
Optional<Buffer::OutlineBuffer> leak_buffer_for_string_construction(Badge<Detail::Utf16StringData>) { return leak_buffer_for_string_construction(); }
|
||||
|
||||
private:
|
||||
void initialize_buffer(Mode, size_t capacity);
|
||||
|
||||
Optional<Buffer::OutlineBuffer> leak_buffer_for_string_construction();
|
||||
|
||||
ErrorOr<void> will_append(size_t);
|
||||
|
||||
Reference in New Issue
Block a user