mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2026-10-24 04:28:10 +00:00
fix: not differentiating wordsize in offset field
This commit is contained in:
7 files changed
+21
-15
No files matched your search
@@ -21,3 +21,8 @@ bool Variable::GetForceAlignment() const
|
||||
{
|
||||
return m_has_alignment_override || m_type_declaration->GetForceAlignment();
|
||||
}
|
||||
|
||||
unsigned Variable::GetOffset(const WordSize wordSize) const
|
||||
{
|
||||
return m_offset[std::to_underlying(wordSize)];
|
||||
}
|
||||
@@ -12,10 +12,11 @@ public:
|
||||
|
||||
[[nodiscard]] unsigned GetAlignment(WordSize wordSize) const;
|
||||
[[nodiscard]] bool GetForceAlignment() const;
|
||||
[[nodiscard]] unsigned GetOffset(WordSize wordSize) const;
|
||||
|
||||
std::string m_name;
|
||||
bool m_has_alignment_override;
|
||||
unsigned m_alignment_override;
|
||||
unsigned m_offset;
|
||||
unsigned m_offset[WORD_SIZE_COUNT];
|
||||
std::unique_ptr<TypeDeclaration> m_type_declaration;
|
||||
};
|
||||
@@ -65,7 +65,7 @@ namespace
|
||||
{
|
||||
if (!member->m_member->m_name.empty() && !member->m_member->m_type_declaration->m_has_custom_bit_size)
|
||||
{
|
||||
LINEF("REQUIRE(offsetof({0}, {1}) == {2});", structure->m_definition->GetFullName(), member->m_member->m_name, member->m_member->m_offset)
|
||||
LINEF("REQUIRE(offsetof({0}, {1}) == {2});", structure->m_definition->GetFullName(), member->m_member->m_name, member->m_member->GetOffset(m_env.m_word_size))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ size_t BasePerVariantTemplate::OffsetForMemberModifier(const MemberInformation&
|
||||
const DeclarationModifierComputations& modifier,
|
||||
const size_t nestedBaseOffset) const
|
||||
{
|
||||
size_t curOffset = memberInfo.m_member->m_offset;
|
||||
size_t curOffset = memberInfo.m_member->GetOffset(m_env.m_word_size);
|
||||
|
||||
auto curLevel = 0u;
|
||||
for (const auto index : modifier.GetArrayIndices())
|
||||
|
||||
@@ -390,7 +390,8 @@ namespace
|
||||
}
|
||||
else
|
||||
{
|
||||
LINEF("fillAccessor.Fill({0}[0], {1});", MakeMemberAccess(&structInfo, &memberInfo, modifier), memberInfo.m_member->m_offset)
|
||||
LINEF(
|
||||
"fillAccessor.Fill({0}[0], {1});", MakeMemberAccess(&structInfo, &memberInfo, modifier), memberInfo.m_member->GetOffset(m_env.m_word_size))
|
||||
}
|
||||
|
||||
LINEF("for (auto i = 1uz; i < dynamicArraySize; i++)", structInfo.m_definition->m_name, memberInfo.m_member->m_name)
|
||||
@@ -507,7 +508,7 @@ namespace
|
||||
}
|
||||
else if (memberInfo.m_member->m_name.empty())
|
||||
{
|
||||
const auto anonymousMemberOffset = memberInfo.m_member->m_offset + nestedBaseOffset;
|
||||
const auto anonymousMemberOffset = memberInfo.m_member->GetOffset(m_env.m_word_size) + nestedBaseOffset;
|
||||
for (const auto& anonymousMember : memberInfo.m_type->m_ordered_members)
|
||||
{
|
||||
PrintFillStruct_Member(structInfo, *anonymousMember, DeclarationModifierComputations(anonymousMember.get()), anonymousMemberOffset);
|
||||
@@ -734,7 +735,7 @@ namespace
|
||||
{
|
||||
LINEF("return LoadDynamicFill_{0}(fillAccessor.AtOffset({1})) + offsetof({2}, {3});",
|
||||
MakeSafeTypeName(member.m_type->m_definition),
|
||||
member.m_member->m_offset,
|
||||
member.m_member->GetOffset(m_env.m_word_size),
|
||||
info.m_definition->GetFullName(),
|
||||
member.m_member->m_name)
|
||||
}
|
||||
@@ -774,7 +775,7 @@ namespace
|
||||
const StructureComputations structureComputations(&info);
|
||||
const auto dynamicMember = structureComputations.GetDynamicMember();
|
||||
|
||||
LINEF("const auto fillAccessor = m_stream.AppendToFill({0}).AtOffset(parentFill.Offset());", dynamicMember->m_member->m_offset)
|
||||
LINEF("const auto fillAccessor = m_stream.AppendToFill({0}).AtOffset(parentFill.Offset());", dynamicMember->m_member->GetOffset(m_env.m_word_size))
|
||||
LINE("")
|
||||
|
||||
for (const auto& member : info.m_ordered_members)
|
||||
|
||||
@@ -844,7 +844,7 @@ namespace
|
||||
std::string MakeReusableInnerOffset(const DataDefinition* dataDefinition, const Variable* member) const
|
||||
{
|
||||
if (m_env.m_word_size_mismatch)
|
||||
return std::to_string(member->m_offset);
|
||||
return std::to_string(member->GetOffset(m_env.m_word_size));
|
||||
|
||||
return std::format("offsetof({0}, {1})", dataDefinition->GetFullName(), member->m_name);
|
||||
}
|
||||
@@ -1138,7 +1138,7 @@ namespace
|
||||
LINE("{")
|
||||
m_intendation++;
|
||||
LINEF("const auto fillAccessor = m_stream->WriteWithFill({0});",
|
||||
dynamicMember == nullptr ? info->m_definition->GetSize(m_env.m_word_size) : dynamicMember->m_member->m_offset)
|
||||
dynamicMember == nullptr ? info->m_definition->GetSize(m_env.m_word_size) : dynamicMember->m_member->GetOffset(m_env.m_word_size))
|
||||
LINEF("{0} = fillAccessor.Offset();", MakeTypeWrittenVarName(info->m_definition))
|
||||
LINEF("FillStruct_{0}(fillAccessor);", MakeSafeTypeName(info->m_definition))
|
||||
m_intendation--;
|
||||
@@ -1310,7 +1310,7 @@ namespace
|
||||
}
|
||||
else if (memberInfo.m_member->m_name.empty())
|
||||
{
|
||||
const auto anonymousMemberOffset = memberInfo.m_member->m_offset + nestedBaseOffset;
|
||||
const auto anonymousMemberOffset = memberInfo.m_member->GetOffset(m_env.m_word_size) + nestedBaseOffset;
|
||||
for (const auto& anonymousMember : memberInfo.m_type->m_ordered_members)
|
||||
{
|
||||
PrintFillStruct_Member(structInfo, *anonymousMember, DeclarationModifierComputations(anonymousMember.get()), anonymousMemberOffset);
|
||||
|
||||
+4
-5
@@ -119,7 +119,7 @@ namespace
|
||||
|
||||
if (member->m_type_declaration->m_has_custom_bit_size)
|
||||
{
|
||||
member->m_offset = definitionSize + currentBitOffset / 8;
|
||||
member->m_offset[std::to_underlying(wordSize)] = definitionSize + currentBitOffset / 8;
|
||||
currentBitOffset += member->m_type_declaration->m_custom_bit_size;
|
||||
}
|
||||
else
|
||||
@@ -135,7 +135,7 @@ namespace
|
||||
utils::Align(definitionSize,
|
||||
member->GetForceAlignment() ? member->GetAlignment(wordSize) : std::min(member->GetAlignment(wordSize), definition->m_pack));
|
||||
|
||||
member->m_offset = definitionSize;
|
||||
member->m_offset[std::to_underlying(wordSize)] = definitionSize;
|
||||
|
||||
definitionSize += member->m_type_declaration->GetSize(wordSize);
|
||||
}
|
||||
@@ -162,11 +162,10 @@ namespace
|
||||
if (!CalculateFields(repository, member->m_type_declaration.get(), wordSize))
|
||||
return false;
|
||||
|
||||
member->m_offset = 0;
|
||||
member->m_offset[std::to_underlying(wordSize)] = 0;
|
||||
|
||||
const auto memberSize = member->m_type_declaration->GetSize(wordSize);
|
||||
if (memberSize > definitionSize)
|
||||
definitionSize = memberSize;
|
||||
definitionSize = std::max(memberSize, definitionSize);
|
||||
}
|
||||
|
||||
definitionSize = utils::Align(definitionSize, definition->m_alignment[std::to_underlying(wordSize)]);
|
||||
|
||||
Reference in new issue
Block a user