From c822ede9e33738d7109479a9257b2ba3570d3f6e Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 4 Jun 2025 21:32:00 +0100 Subject: [PATCH] fix: properly load matching structure dynamic array inside non-matching structure embed --- .../Domain/Information/StructureInformation.h | 1 + .../Generating/Templates/ZoneLoadTemplate.cpp | 21 +++++++++++++------ .../PostProcessing/UsagesPostProcessor.cpp | 3 +++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h index 9ede86df..ce353fde 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h +++ b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h @@ -26,6 +26,7 @@ public: bool m_requires_marking; bool m_has_matching_cross_platform_structure; + bool m_embedded_reference_exists; bool m_non_embedded_reference_exists; bool m_single_pointer_reference_exists; bool m_array_pointer_reference_exists; diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp index 653111d3..affc9d46 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp @@ -64,8 +64,7 @@ namespace { for (const auto* type : m_env.m_used_types) { - if (type->m_info && type->m_type == type->m_info->m_definition && !type->m_info->m_has_matching_cross_platform_structure - && (type->m_is_context_asset || !StructureComputations(type->m_info).IsAsset())) + if (ShouldGenerateFillMethod(*type)) { PrintFillStructMethodDeclaration(type->m_info); } @@ -174,8 +173,7 @@ namespace { for (const auto* type : m_env.m_used_types) { - if (type->m_info && type->m_type == type->m_info->m_definition && !type->m_info->m_has_matching_cross_platform_structure - && (type->m_is_context_asset || !StructureComputations(type->m_info).IsAsset())) + if (ShouldGenerateFillMethod(*type)) { LINE("") PrintFillStructMethod(type->m_info); @@ -253,6 +251,16 @@ namespace return std::format("{0}** var{1}Ptr;", def->GetFullName(), MakeSafeTypeName(def)); } + bool ShouldGenerateFillMethod(const RenderingUsedType& type) + { + const auto isNotForeignAsset = type.m_is_context_asset || !type.m_info || !StructureComputations(type.m_info).IsAsset(); + const auto hasMismatchingStructure = + type.m_info && type.m_type == type.m_info->m_definition && !type.m_info->m_has_matching_cross_platform_structure; + const auto isEmbeddedDynamic = type.m_info && type.m_info->m_embedded_reference_exists && StructureComputations(type.m_info).GetDynamicMember(); + + return isNotForeignAsset && (hasMismatchingStructure || isEmbeddedDynamic); + } + void PrintFillStructMethodDeclaration(const StructureInformation* info) const { LINEF("void FillStruct_{0}(const ZoneStreamFillReadAccessor& fillAccessor);", MakeSafeTypeName(info->m_definition)) @@ -275,7 +283,6 @@ namespace void PrintHeaderLoadMethodDeclaration(const StructureInformation* info) const { - const StructureComputations computations(info); LINEF("void Load_{0}(bool atStreamStart);", MakeSafeTypeName(info->m_definition)) } @@ -501,7 +508,9 @@ namespace if (!hasAnonymousType) { - if (memberInfo.m_type && !memberInfo.m_type->m_has_matching_cross_platform_structure) + const auto hasMismatchingStructure = memberInfo.m_type && !memberInfo.m_type->m_has_matching_cross_platform_structure; + const auto hasDynamicMember = memberInfo.m_type && StructureComputations(memberInfo.m_type).GetDynamicMember(); + if (hasMismatchingStructure || hasDynamicMember) { LINEF("{0} = &{1};", MakeTypeVarName(memberInfo.m_member->m_type_declaration->m_type), MakeMemberAccess(&structInfo, &memberInfo, modifier)) LINEF("FillStruct_{0}(fillAccessor.AtOffset({1}));", diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp index a8dee352..2665a831 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp @@ -35,6 +35,9 @@ namespace if (computations.ShouldIgnore()) continue; + if (computations.IsArray() || member->m_member->m_type_declaration->m_declaration_modifiers.empty()) + member->m_type->m_embedded_reference_exists = true; + if (computations.ContainsNonEmbeddedReference()) member->m_type->m_non_embedded_reference_exists = true;