From 4e9599aabfa9945230dc34bc3b5a79a8b813bbe4 Mon Sep 17 00:00:00 2001 From: Jan Laupetin Date: Sun, 27 Apr 2025 21:04:41 +0200 Subject: [PATCH] chore: detect structs that differ on different architectures * and exclude them from assetstructtests --- .../Domain/Environment/Architecture.h | 8 +++ .../Information/StructureInformation.cpp | 1 + .../Domain/Information/StructureInformation.h | 1 + .../Templates/AssetStructTestsTemplate.cpp | 6 +- .../Parsing/Header/HeaderFileReader.cpp | 2 + .../CrossPlatformStructurePostProcessor.cpp | 58 +++++++++++++++++++ .../CrossPlatformStructurePostProcessor.h | 11 ++++ 7 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CrossPlatformStructurePostProcessor.cpp create mode 100644 src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CrossPlatformStructurePostProcessor.h diff --git a/src/ZoneCodeGeneratorLib/Domain/Environment/Architecture.h b/src/ZoneCodeGeneratorLib/Domain/Environment/Architecture.h index b9bfc8a1..80d06532 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Environment/Architecture.h +++ b/src/ZoneCodeGeneratorLib/Domain/Environment/Architecture.h @@ -6,3 +6,11 @@ enum class Architecture X86, X64 }; + +static constexpr Architecture OWN_ARCHITECTURE = +#if defined(ARCH_x86) + Architecture::X86 +#elif defined(ARCH_x64) + Architecture::X64 +#endif + ; diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.cpp b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.cpp index 75ae23e9..da546082 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.cpp @@ -5,6 +5,7 @@ StructureInformation::StructureInformation(DefinitionWithMembers* definition) m_asset_enum_entry(nullptr), m_is_leaf(false), m_requires_marking(false), + m_has_matching_cross_platform_structure(false), m_non_embedded_reference_exists(false), m_single_pointer_reference_exists(false), m_array_pointer_reference_exists(false), diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h index 301c9098..2abb0b76 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h +++ b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h @@ -24,6 +24,7 @@ public: bool m_is_leaf; bool m_requires_marking; + bool m_has_matching_cross_platform_structure; bool m_non_embedded_reference_exists; bool m_single_pointer_reference_exists; diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp index bb2bb11e..1646dcbb 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/AssetStructTestsTemplate.cpp @@ -37,11 +37,13 @@ namespace LINE("{") m_intendation++; - TestMethod(m_env.m_asset); + if (m_env.m_asset->m_has_matching_cross_platform_structure) + TestMethod(m_env.m_asset); + for (auto* structure : m_env.m_used_structures) { StructureComputations computations(structure->m_info); - if (!structure->m_info->m_definition->m_anonymous && !computations.IsAsset()) + if (!structure->m_info->m_definition->m_anonymous && !computations.IsAsset() && structure->m_info->m_has_matching_cross_platform_structure) TestMethod(structure->m_info); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp index 4913e089..605c9226 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/CrossPlatformStructurePostProcessor.h" #include "Parsing/PostProcessing/IPostProcessor.h" #include @@ -67,6 +68,7 @@ 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()); } bool HeaderFileReader::ReadHeaderFile(IDataRepository* repository) diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CrossPlatformStructurePostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CrossPlatformStructurePostProcessor.cpp new file mode 100644 index 00000000..397e9844 --- /dev/null +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CrossPlatformStructurePostProcessor.cpp @@ -0,0 +1,58 @@ +#include "CrossPlatformStructurePostProcessor.h" + +#include "Domain/Definition/PointerDeclarationModifier.h" + +#include + +namespace +{ + bool CalculateHasMatchingCrossPlatformStructure(std::unordered_set& visitedStructures, StructureInformation* info) + { + if (visitedStructures.find(info) != visitedStructures.end()) + return info->m_has_matching_cross_platform_structure; + + visitedStructures.emplace(info); + + for (const auto& member : info->m_ordered_members) + { + for (const auto& modifier : member->m_member->m_type_declaration->m_declaration_modifiers) + { + if (modifier->GetType() == DeclarationModifierType::POINTER) + { + info->m_has_matching_cross_platform_structure = false; + return false; + } + } + + if (member->m_type != nullptr && member->m_type != info && !CalculateHasMatchingCrossPlatformStructure(visitedStructures, member->m_type)) + { + info->m_has_matching_cross_platform_structure = false; + return false; + } + } + + info->m_has_matching_cross_platform_structure = true; + return true; + } +} // namespace + +bool CrossPlatformStructurePostProcessor::PostProcess(IDataRepository* repository) +{ + const auto& allInfos = repository->GetAllStructureInformation(); + + if (repository->GetArchitecture() == OWN_ARCHITECTURE) + { + for (const auto& info : allInfos) + info->m_has_matching_cross_platform_structure = true; + } + else + { + std::unordered_set visitedStructures; + for (const auto& info : allInfos) + { + CalculateHasMatchingCrossPlatformStructure(visitedStructures, info); + } + } + + return true; +} diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CrossPlatformStructurePostProcessor.h b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CrossPlatformStructurePostProcessor.h new file mode 100644 index 00000000..26caa2d1 --- /dev/null +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CrossPlatformStructurePostProcessor.h @@ -0,0 +1,11 @@ +#pragma once + +#include "IPostProcessor.h" + +#include + +class CrossPlatformStructurePostProcessor final : public IPostProcessor +{ +public: + bool PostProcess(IDataRepository* repository) override; +};