From 8f633d17ec05d888e919eeea2b76c3284ce607c6 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Tue, 28 May 2024 20:44:26 -0500 Subject: [PATCH] [ox/preloader] Fix alignment issue --- .../deps/ox/src/ox/preloader/preloader.hpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/deps/nostalgia/deps/ox/src/ox/preloader/preloader.hpp b/deps/nostalgia/deps/ox/src/ox/preloader/preloader.hpp index 8f675ba..fd428bb 100644 --- a/deps/nostalgia/deps/ox/src/ox/preloader/preloader.hpp +++ b/deps/nostalgia/deps/ox/src/ox/preloader/preloader.hpp @@ -94,7 +94,7 @@ class Preloader: public ModelHandlerBase, OpType::Reflect> { } template - constexpr ox::Error field(CRStringView, const ox::UnionView val) noexcept; + constexpr ox::Error field(CRStringView, ox::UnionView val) noexcept; template constexpr ox::Error field(CRStringView, const T *val) noexcept; @@ -135,6 +135,9 @@ class Preloader: public ModelHandlerBase, OpType::Reflect> { constexpr ox::Error fieldArray(CRStringView name, ox::ModelValueArray const*val) noexcept; constexpr bool unionCheckAndIt() noexcept; + + [[nodiscard]] + constexpr size_t calcPadding(size_t align) const noexcept; }; template @@ -265,7 +268,7 @@ template constexpr ox::Result Preloader::startAlloc(size_t sz, size_t align) noexcept { m_allocStack.emplace_back(static_cast(m_writer.tellp())); oxReturnError(m_writer.seekp(0, ox::ios_base::end)); - const auto padding = m_writer.tellp() % align; + auto const padding = calcPadding(align); oxRequireM(a, ox::allocate(m_writer, sz + padding)); a += padding; oxReturnError(m_writer.seekp(a)); @@ -278,7 +281,7 @@ constexpr ox::Result Preloader::startAlloc( std::size_t sz, size_t align, std::size_t restore) noexcept { m_allocStack.emplace_back(restore, ox::ios_base::beg); oxReturnError(m_writer.seekp(0, ox::ios_base::end)); - const auto padding = m_writer.tellp() % align; + auto const padding = calcPadding(align); oxRequireM(a, ox::allocate(m_writer, sz + padding)); a += padding; oxReturnError(m_writer.seekp(a)); @@ -358,7 +361,7 @@ constexpr ox::Error Preloader::fieldVector( const auto sz = sizeOf(&(*val)[0]) * val->size(); const auto align = alignOf((*val)[0]); oxReturnError(m_writer.seekp(0, ox::ios_base::end)); - const auto padding = m_writer.tellp() % align; + auto const padding = calcPadding(align); oxRequireM(p, ox::allocate(m_writer, sz + padding)); p += padding; oxReturnError(m_writer.seekp(p)); @@ -394,6 +397,12 @@ constexpr bool Preloader::unionCheckAndIt() noexcept { return u.checkAndIterate(); } +template +constexpr size_t Preloader::calcPadding(size_t align) const noexcept { + auto const excess = m_writer.tellp() % align; + return (align * (excess != 0)) - excess; +} + template constexpr ox::Error preload(Preloader *pl, ox::CommonPtrWith auto *obj) noexcept { oxReturnError(model(pl->interface(), obj));