fix: filling x64 structs with dynamic array size

This commit is contained in:
Jan 2025-06-03 21:15:29 +01:00
parent 1697409cc2
commit a9142d19b6
No known key found for this signature in database
GPG Key ID: 44B581F78FF5C57C

View File

@ -396,7 +396,7 @@ namespace
const size_t nestedBaseOffset) const size_t nestedBaseOffset)
{ {
LINEF("const auto dynamicArraySize = {0};", MakeEvaluation(modifier.GetDynamicArraySizeEvaluation())) LINEF("const auto dynamicArraySize = static_cast<size_t>({0});", MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()))
LINE("if (dynamicArraySize > 0)") LINE("if (dynamicArraySize > 0)")
LINE("{") LINE("{")
m_intendation++; m_intendation++;
@ -415,23 +415,25 @@ namespace
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->m_offset)
} }
LINEF("const auto dynamicFill = m_stream.LoadWithFill({0} * static_cast<size_t>(dynamicArraySize - 1));", /*LINEF("const auto dynamicFill = m_stream.LoadWithFill({0} * static_cast<size_t>(dynamicArraySize - 1));",
memberInfo.m_member->m_type_declaration->GetSize()) memberInfo.m_member->m_type_declaration->GetSize())*/
LINEF("for (auto i = 1u; i < dynamicArraySize; i++)", structInfo.m_definition->m_name, memberInfo.m_member->m_name) LINEF("for (auto i = 1uz; i < dynamicArraySize; i++)", structInfo.m_definition->m_name, memberInfo.m_member->m_name)
LINE("{") LINE("{")
m_intendation++; m_intendation++;
if (callFillForMember) if (callFillForMember)
{ {
LINEF("{0} = &{1}[i];", MakeTypeVarName(memberInfo.m_member->m_type_declaration->m_type), MakeMemberAccess(&structInfo, &memberInfo, modifier)) LINEF("{0} = &{1}[i];", MakeTypeVarName(memberInfo.m_member->m_type_declaration->m_type), MakeMemberAccess(&structInfo, &memberInfo, modifier))
LINEF("FillStruct_{0}(dynamicFill.AtOffset((i - 1u) * {1}));", LINEF("FillStruct_{0}(fillAccessor.AtOffset({1} + i * {2}));",
MakeSafeTypeName(memberInfo.m_member->m_type_declaration->m_type), MakeSafeTypeName(memberInfo.m_member->m_type_declaration->m_type),
OffsetForMemberModifier(memberInfo, modifier, nestedBaseOffset),
memberInfo.m_member->m_type_declaration->GetSize()) memberInfo.m_member->m_type_declaration->GetSize())
} }
else else
{ {
LINEF("dynamicFill.Fill({0}[i], (i - 1u) * {1});", LINEF("fillAccessor.Fill({0}[i], {1} + i * {2});",
MakeMemberAccess(&structInfo, &memberInfo, modifier), MakeMemberAccess(&structInfo, &memberInfo, modifier),
OffsetForMemberModifier(memberInfo, modifier, nestedBaseOffset),
memberInfo.m_member->m_type_declaration->GetSize()) memberInfo.m_member->m_type_declaration->GetSize())
} }
m_intendation--; m_intendation--;
@ -1040,7 +1042,7 @@ namespace
LINE("{") LINE("{")
m_intendation++; m_intendation++;
LINEF("{0} = var;", MakeTypeVarName(def)) LINEF("{0} = var;", MakeTypeVarName(info->m_definition))
LINEF("FillStruct_{0}(arrayFill.AtOffset(0 + {1} * index));", info->m_definition->m_name, def->GetSize()) LINEF("FillStruct_{0}(arrayFill.AtOffset(0 + {1} * index));", info->m_definition->m_name, def->GetSize())
LINE("var++;") LINE("var++;")