2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2026-01-13 12:11:50 +00:00

fix: do not fill in runtime block members

This commit is contained in:
Jan Laupetin
2026-01-11 21:43:01 +00:00
parent 3169086849
commit e9eb7b7b89
3 changed files with 21 additions and 10 deletions

View File

@@ -486,16 +486,23 @@ namespace
else if (member->m_type && !member->m_type->m_has_matching_cross_platform_structure) else if (member->m_type && !member->m_type->m_has_matching_cross_platform_structure)
{ {
LINEF("const auto fillArraySize = static_cast<size_t>({0});", MakeEvaluation(modifier.GetArrayPointerCountEvaluation())) LINEF("const auto fillArraySize = static_cast<size_t>({0});", MakeEvaluation(modifier.GetArrayPointerCountEvaluation()))
LINEF("const auto fill = m_stream->WriteWithFill({0} * fillArraySize);", member->m_member->m_type_declaration->m_type->GetSize()) if (!computations.IsInRuntimeBlock())
LINE("for (auto i = 0uz; i < fillArraySize; i++)") {
LINE("{") LINEF("const auto fill = m_stream->WriteWithFill({0} * fillArraySize);", member->m_member->m_type_declaration->m_type->GetSize())
m_intendation++; LINE("for (auto i = 0uz; i < fillArraySize; i++)")
LINEF("{0} = &{1}[i];", MakeTypeVarName(member->m_type->m_definition), MakeMemberAccess(info, member, modifier)) LINE("{")
LINEF("FillStruct_{0}(fill.AtOffset(i * {1}));", m_intendation++;
MakeSafeTypeName(member->m_type->m_definition), LINEF("{0} = &{1}[i];", MakeTypeVarName(member->m_type->m_definition), MakeMemberAccess(info, member, modifier))
member->m_member->m_type_declaration->m_type->GetSize()) LINEF("FillStruct_{0}(fill.AtOffset(i * {1}));",
m_intendation--; MakeSafeTypeName(member->m_type->m_definition),
LINE("}") member->m_member->m_type_declaration->m_type->GetSize())
m_intendation--;
LINE("}")
}
else
{
LINEF("m_stream->IncBlockPos({0} * fillArraySize);", member->m_member->m_type_declaration->m_type->GetSize())
}
} }
else else
{ {

View File

@@ -360,10 +360,12 @@ ZoneStreamFillWriteAccessor::ZoneStreamFillWriteAccessor(void* blockBuffer, cons
ZoneStreamFillWriteAccessor ZoneStreamFillWriteAccessor::AtOffset(const size_t offset) const ZoneStreamFillWriteAccessor ZoneStreamFillWriteAccessor::AtOffset(const size_t offset) const
{ {
assert(m_block_buffer);
return ZoneStreamFillWriteAccessor(static_cast<char*>(m_block_buffer) + offset, m_buffer_size - offset); return ZoneStreamFillWriteAccessor(static_cast<char*>(m_block_buffer) + offset, m_buffer_size - offset);
} }
ZoneOutputOffset ZoneStreamFillWriteAccessor::Offset() const ZoneOutputOffset ZoneStreamFillWriteAccessor::Offset() const
{ {
assert(m_block_buffer);
return ZoneOutputOffset(m_block_buffer); return ZoneOutputOffset(m_block_buffer);
} }

View File

@@ -36,6 +36,7 @@ public:
template<typename T> void Fill(const T& value, const size_t offset) const template<typename T> void Fill(const T& value, const size_t offset) const
{ {
assert(m_block_buffer);
assert(offset + sizeof(T) <= m_buffer_size); assert(offset + sizeof(T) <= m_buffer_size);
*reinterpret_cast<T*>(static_cast<char*>(m_block_buffer) + offset) = value; *reinterpret_cast<T*>(static_cast<char*>(m_block_buffer) + offset) = value;
@@ -43,6 +44,7 @@ public:
template<typename T, size_t S> void FillArray(T (&value)[S], const size_t offset) const template<typename T, size_t S> void FillArray(T (&value)[S], const size_t offset) const
{ {
assert(m_block_buffer);
assert(offset + sizeof(T) * S <= m_buffer_size); assert(offset + sizeof(T) * S <= m_buffer_size);
std::memcpy(static_cast<char*>(m_block_buffer) + offset, value, sizeof(T) * S); std::memcpy(static_cast<char*>(m_block_buffer) + offset, value, sizeof(T) * S);