[ox/preloader] Fix alignment issue
This commit is contained in:
parent
5a426829f2
commit
0b8051b6cc
17
deps/ox/src/ox/preloader/preloader.hpp
vendored
17
deps/ox/src/ox/preloader/preloader.hpp
vendored
@ -94,7 +94,7 @@ class Preloader: public ModelHandlerBase<Preloader<PlatSpec>, OpType::Reflect> {
|
||||
}
|
||||
|
||||
template<typename U, bool force>
|
||||
constexpr ox::Error field(CRStringView, const ox::UnionView<U, force> val) noexcept;
|
||||
constexpr ox::Error field(CRStringView, ox::UnionView<U, force> val) noexcept;
|
||||
|
||||
template<typename T>
|
||||
constexpr ox::Error field(CRStringView, const T *val) noexcept;
|
||||
@ -135,6 +135,9 @@ class Preloader: public ModelHandlerBase<Preloader<PlatSpec>, 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<typename PlatSpec>
|
||||
@ -265,7 +268,7 @@ template<typename PlatSpec>
|
||||
constexpr ox::Result<std::size_t> Preloader<PlatSpec>::startAlloc(size_t sz, size_t align) noexcept {
|
||||
m_allocStack.emplace_back(static_cast<typename PlatSpec::PtrType>(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<std::size_t> Preloader<PlatSpec>::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<PlatSpec>::fieldVector(
|
||||
const auto sz = sizeOf<PlatSpec>(&(*val)[0]) * val->size();
|
||||
const auto align = alignOf<PlatSpec>((*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<PlatSpec>::unionCheckAndIt() noexcept {
|
||||
return u.checkAndIterate();
|
||||
}
|
||||
|
||||
template<typename PlatSpec>
|
||||
constexpr size_t Preloader<PlatSpec>::calcPadding(size_t align) const noexcept {
|
||||
auto const excess = m_writer.tellp() % align;
|
||||
return (align * (excess != 0)) - excess;
|
||||
}
|
||||
|
||||
template<typename PlatSpec, typename T>
|
||||
constexpr ox::Error preload(Preloader<PlatSpec> *pl, ox::CommonPtrWith<T> auto *obj) noexcept {
|
||||
oxReturnError(model(pl->interface(), obj));
|
||||
|
Loading…
Reference in New Issue
Block a user