From 3040e6c90ac9ae82e3234b3de14a93a37910e5e5 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Sat, 3 Dec 2022 16:32:56 -0600 Subject: [PATCH] [ox/preloader] Make Preloader use small string section of strings when able --- deps/ox/src/ox/preloader/preloader.hpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/deps/ox/src/ox/preloader/preloader.hpp b/deps/ox/src/ox/preloader/preloader.hpp index 76fdcf9c..1def42d8 100644 --- a/deps/ox/src/ox/preloader/preloader.hpp +++ b/deps/ox/src/ox/preloader/preloader.hpp @@ -175,15 +175,20 @@ constexpr ox::Error Preloader::field(CRStringView, const ox::BasicStri } using VecMap = ox::VectorMemMap; const auto sz = val->bytes(); - oxRequire(a, ox::allocate(&m_writer, sz)); - const VecMap vecVal{ + VecMap vecVal{ .smallVecSize = SmallStringSize, .size = PlatSpec::correctEndianness(static_cast(sz)), .cap = PlatSpec::correctEndianness(static_cast(sz)), - .items = sz ? PlatSpec::correctEndianness(static_cast(a) + PlatSpec::RomStart) : 0, }; oxReturnError(pad(&vecVal)); const auto restore = m_writer.tellp(); + std::size_t a = 0; + if (sz && sz >= SmallStringSize) { + oxReturnError(ox::allocate(&m_writer, sz).moveTo(&a)); + } else { + a = restore; + } + vecVal.items = sz ? PlatSpec::correctEndianness(static_cast(a) + PlatSpec::RomStart) : 0; oxReturnError(m_writer.seekp(a)); oxReturnError(m_writer.write(val->data(), sz)); oxReturnError(m_writer.seekp(restore));