From 14b143466d082bc54518952d30edf69d5c7e1871 Mon Sep 17 00:00:00 2001 From: Jan Laupetin Date: Sat, 14 Mar 2026 15:56:08 +0100 Subject: [PATCH] fix: not adding offset of reusable type when type is not structure --- .../Domain/Information/MemberInformation.cpp | 3 +- .../Domain/Information/MemberInformation.h | 4 +- .../Information/StructureInformation.cpp | 5 ++- .../Domain/Information/StructureInformation.h | 5 ++- .../Domain/Information/TypeInformation.cpp | 7 ++++ .../Domain/Information/TypeInformation.h | 12 ++++++ .../Generating/Templates/ZoneLoadTemplate.cpp | 2 +- .../Templates/ZoneWriteTemplate.cpp | 2 +- .../Parsing/Header/HeaderFileReader.cpp | 2 + .../CreateMemberInformationPostProcessor.cpp | 5 ++- ...reateStructureInformationPostProcessor.cpp | 4 +- .../CreateTypeInformationPostProcessor.cpp | 34 +++++++++++++++++ .../CreateTypeInformationPostProcessor.h | 9 +++++ .../PostProcessing/UsagesPostProcessor.cpp | 38 +++++++++---------- .../Persistence/IDataRepository.h | 2 + .../InMemory/InMemoryRepository.cpp | 29 +++++++++++--- .../Persistence/InMemory/InMemoryRepository.h | 14 ++++--- 17 files changed, 135 insertions(+), 42 deletions(-) create mode 100644 src/ZoneCodeGeneratorLib/Domain/Information/TypeInformation.cpp create mode 100644 src/ZoneCodeGeneratorLib/Domain/Information/TypeInformation.h create mode 100644 src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateTypeInformationPostProcessor.cpp create mode 100644 src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateTypeInformationPostProcessor.h diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.cpp b/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.cpp index a19fc05c..b1027e07 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.cpp @@ -1,8 +1,9 @@ #include "MemberInformation.h" -MemberInformation::MemberInformation(StructureInformation* parent, StructureInformation* type, Variable* member) +MemberInformation::MemberInformation(StructureInformation* parent, StructureInformation* type, TypeInformation* typeInfo, Variable* member) : m_parent(parent), m_type(type), + m_type_info(typeInfo), m_member(member), m_is_string(false), m_is_script_string(false), diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h b/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h index f517e069..841544c2 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h +++ b/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h @@ -4,6 +4,7 @@ #include "Domain/Evaluation/IEvaluation.h" #include "Domain/FastFile/FastFileBlock.h" #include "StructureInformation.h" +#include "TypeInformation.h" #include @@ -12,10 +13,11 @@ class StructureInformation; class MemberInformation { public: - MemberInformation(StructureInformation* parent, StructureInformation* type, Variable* member); + MemberInformation(StructureInformation* parent, StructureInformation* type, TypeInformation* typeInfo, Variable* member); StructureInformation* m_parent; StructureInformation* m_type; + TypeInformation* m_type_info; Variable* m_member; bool m_is_string; bool m_is_script_string; diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.cpp b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.cpp index 9959c1be..5ea50078 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.cpp @@ -1,16 +1,17 @@ #include "StructureInformation.h" -StructureInformation::StructureInformation(DefinitionWithMembers* definition) +StructureInformation::StructureInformation(DefinitionWithMembers* definition, TypeInformation* typeInfo) : m_definition(definition), + m_type_info(typeInfo), m_is_leaf(false), m_requires_marking(false), m_has_matching_cross_platform_structure(false), + m_embedded_reference_exists(false), m_non_embedded_reference_exists(false), m_single_pointer_reference_exists(false), m_array_pointer_reference_exists(false), m_array_reference_exists(false), m_reference_from_non_default_normal_block_exists(false), - m_reusable_reference_exists(false), m_post_load_action(nullptr), m_block(nullptr) { diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h index ce353fde..f3518c8f 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h +++ b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h @@ -5,6 +5,7 @@ #include "Domain/Extension/CustomAction.h" #include "Domain/FastFile/FastFileBlock.h" #include "MemberInformation.h" +#include "TypeInformation.h" #include #include @@ -14,9 +15,10 @@ class MemberInformation; class StructureInformation { public: - explicit StructureInformation(DefinitionWithMembers* definition); + StructureInformation(DefinitionWithMembers* definition, TypeInformation* typeInfo); DefinitionWithMembers* m_definition; + TypeInformation* m_type_info; std::string m_asset_name; std::vector m_usages; @@ -32,7 +34,6 @@ public: bool m_array_pointer_reference_exists; bool m_array_reference_exists; bool m_reference_from_non_default_normal_block_exists; - bool m_reusable_reference_exists; std::unique_ptr m_post_load_action; const FastFileBlock* m_block; diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/TypeInformation.cpp b/src/ZoneCodeGeneratorLib/Domain/Information/TypeInformation.cpp new file mode 100644 index 00000000..26da06b2 --- /dev/null +++ b/src/ZoneCodeGeneratorLib/Domain/Information/TypeInformation.cpp @@ -0,0 +1,7 @@ +#include "TypeInformation.h" + +TypeInformation::TypeInformation(DataDefinition* definition) + : m_definition(definition), + m_reusable_reference_exists(false) +{ +} diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/TypeInformation.h b/src/ZoneCodeGeneratorLib/Domain/Information/TypeInformation.h new file mode 100644 index 00000000..7e072901 --- /dev/null +++ b/src/ZoneCodeGeneratorLib/Domain/Information/TypeInformation.h @@ -0,0 +1,12 @@ +#pragma once + +#include "Domain/Definition/DataDefinition.h" + +class TypeInformation +{ +public: + explicit TypeInformation(DataDefinition* definition); + + DataDefinition* m_definition; + bool m_reusable_reference_exists; +}; diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp index cd8c10e6..76b2a4b2 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp @@ -661,7 +661,7 @@ namespace void PrintFillStruct_Struct(const StructureInformation& info) { - if (info.m_reusable_reference_exists) + if (info.m_type_info && info.m_type_info->m_reusable_reference_exists) { LINEF("m_stream.AddPointerLookup({0}, fillAccessor.BlockBuffer(0));", MakeTypeVarName(info.m_definition)) LINE("") diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp index cee2e80b..96b41946 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp @@ -715,7 +715,7 @@ namespace if (member->m_is_reusable) return true; - if (member->m_type == nullptr || !member->m_type->m_reusable_reference_exists) + if (member->m_type_info == nullptr || !member->m_type_info->m_reusable_reference_exists) return false; return true; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp index 6f548feb..ee491e16 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp @@ -9,6 +9,7 @@ #include "Parsing/Impl/ParserFilesystemStream.h" #include "Parsing/PostProcessing/CreateMemberInformationPostProcessor.h" #include "Parsing/PostProcessing/CreateStructureInformationPostProcessor.h" +#include "Parsing/PostProcessing/CreateTypeInformationPostProcessor.h" #include "Parsing/PostProcessing/IPostProcessor.h" #include "Utils/Logging/Log.h" @@ -66,6 +67,7 @@ void HeaderFileReader::SetupStreamProxies() void HeaderFileReader::SetupPostProcessors() { // Order is important + m_post_processors.emplace_back(std::make_unique()); m_post_processors.emplace_back(std::make_unique()); m_post_processors.emplace_back(std::make_unique()); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.cpp index 4533fb0a..fe039600 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.cpp @@ -4,7 +4,7 @@ namespace { - bool CreateMemberInformationForStructure(IDataRepository* repository, StructureInformation* structure) + bool CreateMemberInformationForStructure(const IDataRepository* repository, StructureInformation* structure) { for (const auto& member : structure->m_definition->m_members) { @@ -21,7 +21,8 @@ namespace if (memberDefinition != nullptr) typeInfo = repository->GetInformationFor(memberDefinition); - structure->m_ordered_members.emplace_back(std::make_unique(structure, typeInfo, member.get())); + structure->m_ordered_members.emplace_back( + std::make_unique(structure, typeInfo, repository->GetTypeInformationFor(member->m_type_declaration->m_type), member.get())); } return true; diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateStructureInformationPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateStructureInformationPostProcessor.cpp index 08a4d50a..1cddfd72 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateStructureInformationPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateStructureInformationPostProcessor.cpp @@ -6,14 +6,14 @@ bool CreateStructureInformationPostProcessor::PostProcess(IDataRepository* repos { auto* information = repository->GetInformationFor(structDefinition); if (information == nullptr) - repository->Add(std::make_unique(structDefinition)); + repository->Add(std::make_unique(structDefinition, repository->GetTypeInformationFor(structDefinition))); } for (auto* unionDefinition : repository->GetAllUnions()) { auto* information = repository->GetInformationFor(unionDefinition); if (information == nullptr) - repository->Add(std::make_unique(unionDefinition)); + repository->Add(std::make_unique(unionDefinition, repository->GetTypeInformationFor(unionDefinition))); } return true; diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateTypeInformationPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateTypeInformationPostProcessor.cpp new file mode 100644 index 00000000..31bdc0ac --- /dev/null +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateTypeInformationPostProcessor.cpp @@ -0,0 +1,34 @@ +#include "CreateTypeInformationPostProcessor.h" + +bool CreateTypeInformationPostProcessor::PostProcess(IDataRepository* repository) +{ + for (auto* _enum : repository->GetAllEnums()) + { + const auto* information = repository->GetTypeInformationFor(_enum); + if (information == nullptr) + repository->Add(std::make_unique(_enum)); + } + + for (auto* _typeDef : repository->GetAllTypedefs()) + { + const auto* information = repository->GetTypeInformationFor(_typeDef); + if (information == nullptr) + repository->Add(std::make_unique(_typeDef)); + } + + for (auto* _struct : repository->GetAllStructs()) + { + const auto* information = repository->GetTypeInformationFor(_struct); + if (information == nullptr) + repository->Add(std::make_unique(_struct)); + } + + for (auto* _union : repository->GetAllUnions()) + { + const auto* information = repository->GetTypeInformationFor(_union); + if (information == nullptr) + repository->Add(std::make_unique(_union)); + } + + return true; +} diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateTypeInformationPostProcessor.h b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateTypeInformationPostProcessor.h new file mode 100644 index 00000000..ff36aec2 --- /dev/null +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateTypeInformationPostProcessor.h @@ -0,0 +1,9 @@ +#pragma once + +#include "IPostProcessor.h" + +class CreateTypeInformationPostProcessor final : public IPostProcessor +{ +public: + bool PostProcess(IDataRepository* repository) override; +}; diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp index 2665a831..cebf5787 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp @@ -27,37 +27,37 @@ namespace for (const auto& member : currentStructure->m_ordered_members) { - if (member->m_type == nullptr) - continue; - const MemberComputations computations(member.get()); 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 (member->m_is_reusable && member->m_type_info) + member->m_type_info->m_reusable_reference_exists = true; - if (computations.ContainsNonEmbeddedReference()) - member->m_type->m_non_embedded_reference_exists = true; + if (member->m_type) + { + if (computations.IsArray() || member->m_member->m_type_declaration->m_declaration_modifiers.empty()) + member->m_type->m_embedded_reference_exists = true; - if (computations.ContainsSinglePointerReference()) - member->m_type->m_single_pointer_reference_exists = true; + if (computations.ContainsNonEmbeddedReference()) + member->m_type->m_non_embedded_reference_exists = true; - if (computations.ContainsArrayPointerReference()) - member->m_type->m_array_pointer_reference_exists = true; + if (computations.ContainsSinglePointerReference()) + member->m_type->m_single_pointer_reference_exists = true; - if (computations.ContainsArrayReference()) - member->m_type->m_array_reference_exists = true; + if (computations.ContainsArrayPointerReference()) + member->m_type->m_array_pointer_reference_exists = true; - if (computations.IsNotInDefaultNormalBlock()) - member->m_type->m_reference_from_non_default_normal_block_exists = true; + if (computations.ContainsArrayReference()) + member->m_type->m_array_reference_exists = true; - if (member->m_is_reusable) - member->m_type->m_reusable_reference_exists = true; + if (computations.IsNotInDefaultNormalBlock()) + member->m_type->m_reference_from_non_default_normal_block_exists = true; - member->m_type->m_usages.push_back(currentStructure); - processingQueue.push(member->m_type); + member->m_type->m_usages.push_back(currentStructure); + processingQueue.push(member->m_type); + } } } diff --git a/src/ZoneCodeGeneratorLib/Persistence/IDataRepository.h b/src/ZoneCodeGeneratorLib/Persistence/IDataRepository.h index f483f497..563b5ab9 100644 --- a/src/ZoneCodeGeneratorLib/Persistence/IDataRepository.h +++ b/src/ZoneCodeGeneratorLib/Persistence/IDataRepository.h @@ -24,6 +24,7 @@ public: virtual void Add(std::unique_ptr structDefinition) = 0; virtual void Add(std::unique_ptr unionDefinition) = 0; virtual void Add(std::unique_ptr typedefDefinition) = 0; + virtual void Add(std::unique_ptr typeInformation) = 0; virtual void Add(std::unique_ptr structureInformation) = 0; virtual void Add(std::unique_ptr fastFileBlock) = 0; @@ -41,6 +42,7 @@ public: [[nodiscard]] virtual DataDefinition* GetDataDefinitionByName(const std::string& name) const = 0; [[nodiscard]] virtual StructureInformation* GetInformationFor(const DefinitionWithMembers* definitionWithMembers) const = 0; + [[nodiscard]] virtual TypeInformation* GetTypeInformationFor(const DataDefinition* definition) const = 0; [[nodiscard]] virtual EnumMember* GetEnumMemberByName(const std::string& name) const = 0; [[nodiscard]] virtual const FastFileBlock* GetFastFileBlockByName(const std::string& name) const = 0; }; diff --git a/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.cpp b/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.cpp index 62cd54f3..792e1d2b 100644 --- a/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.cpp +++ b/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.cpp @@ -24,7 +24,7 @@ InMemoryRepository::~InMemoryRepository() void InMemoryRepository::Add(std::unique_ptr enumsDefinition) { auto* raw = enumsDefinition.release(); - m_enums.push_back(raw); + m_enums.emplace_back(raw); m_data_definitions_by_name[raw->m_name] = raw; for (const auto& enumMember : raw->m_members) @@ -34,35 +34,42 @@ void InMemoryRepository::Add(std::unique_ptr enumsDefinition) void InMemoryRepository::Add(std::unique_ptr structDefinition) { auto* raw = structDefinition.release(); - m_structs.push_back(raw); + m_structs.emplace_back(raw); m_data_definitions_by_name[raw->m_name] = raw; } void InMemoryRepository::Add(std::unique_ptr unionDefinition) { auto* raw = unionDefinition.release(); - m_unions.push_back(raw); + m_unions.emplace_back(raw); m_data_definitions_by_name[raw->m_name] = raw; } void InMemoryRepository::Add(std::unique_ptr typedefDefinition) { auto* raw = typedefDefinition.release(); - m_typedefs.push_back(raw); + m_typedefs.emplace_back(raw); m_data_definitions_by_name[raw->m_name] = raw; } void InMemoryRepository::Add(std::unique_ptr structureInformation) { auto* raw = structureInformation.release(); - m_structures_information.push_back(raw); + m_structures_information.emplace_back(raw); m_structure_information_by_definition[raw->m_definition] = raw; } +void InMemoryRepository::Add(std::unique_ptr typeInformation) +{ + auto* raw = typeInformation.release(); + m_types_information.emplace_back(raw); + m_type_information_by_definition[raw->m_definition] = raw; +} + void InMemoryRepository::Add(std::unique_ptr fastFileBlock) { auto* raw = fastFileBlock.release(); - m_fast_file_blocks.push_back(raw); + m_fast_file_blocks.emplace_back(raw); m_fast_file_blocks_by_name[raw->m_name] = raw; } @@ -136,6 +143,16 @@ StructureInformation* InMemoryRepository::GetInformationFor(const DefinitionWith return nullptr; } +TypeInformation* InMemoryRepository::GetTypeInformationFor(const DataDefinition* definition) const +{ + const auto foundEntry = m_type_information_by_definition.find(definition); + + if (foundEntry != m_type_information_by_definition.end()) + return foundEntry->second; + + return nullptr; +} + EnumMember* InMemoryRepository::GetEnumMemberByName(const std::string& name) const { const auto foundEntry = m_enum_members_by_name.find(name); diff --git a/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.h b/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.h index be23e522..918d5620 100644 --- a/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.h +++ b/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.h @@ -2,7 +2,7 @@ #include "Persistence/IDataRepository.h" -#include +#include class InMemoryRepository final : public IDataRepository { @@ -19,6 +19,7 @@ public: void Add(std::unique_ptr unionDefinition) override; void Add(std::unique_ptr typedefDefinition) override; void Add(std::unique_ptr structureInformation) override; + void Add(std::unique_ptr typeInformation) override; void Add(std::unique_ptr fastFileBlock) override; [[nodiscard]] const std::string& GetGameName() const override; @@ -35,6 +36,7 @@ public: [[nodiscard]] DataDefinition* GetDataDefinitionByName(const std::string& name) const override; [[nodiscard]] StructureInformation* GetInformationFor(const DefinitionWithMembers* definitionWithMembers) const override; + [[nodiscard]] TypeInformation* GetTypeInformationFor(const DataDefinition* definition) const override; [[nodiscard]] EnumMember* GetEnumMemberByName(const std::string& name) const override; [[nodiscard]] const FastFileBlock* GetFastFileBlockByName(const std::string& name) const override; @@ -44,11 +46,13 @@ private: std::vector m_unions; std::vector m_typedefs; std::vector m_structures_information; + std::vector m_types_information; std::vector m_fast_file_blocks; - std::map m_data_definitions_by_name; - std::map m_enum_members_by_name; - std::map m_fast_file_blocks_by_name; - std::map m_structure_information_by_definition; + std::unordered_map m_data_definitions_by_name; + std::unordered_map m_enum_members_by_name; + std::unordered_map m_fast_file_blocks_by_name; + std::unordered_map m_structure_information_by_definition; + std::unordered_map m_type_information_by_definition; std::string m_game_name; Architecture m_architecture; };