From 1d33cf2adfc0876984b60000608a36a66d8772e0 Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 20 Mar 2021 16:04:17 +0100 Subject: [PATCH] Save offset for reusing for any type that has a reusable reference --- .../Domain/Information/StructureInformation.cpp | 1 + .../Domain/Information/StructureInformation.h | 1 + .../Generating/Templates/ZoneWriteTemplate.cpp | 11 ++++++----- .../Parsing/PostProcessing/UsagesPostProcessor.cpp | 3 +++ 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.cpp b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.cpp index cf7d5321..cda4cba4 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.cpp @@ -9,6 +9,7 @@ StructureInformation::StructureInformation(DefinitionWithMembers* definition) 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 a20970a8..29c19e98 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h +++ b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h @@ -24,6 +24,7 @@ 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/Generating/Templates/ZoneWriteTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp index ecda827c..3076f809 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp @@ -381,6 +381,9 @@ class ZoneWriteTemplate::Internal final : BaseTemplate static bool WriteMember_ShouldMakeInsertReuse(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberWriteType writeType) { + if (member->m_type == nullptr || !member->m_type->m_reusable_reference_exists) + return false; + if (writeType != MemberWriteType::ARRAY_POINTER && writeType != MemberWriteType::SINGLE_POINTER && writeType != MemberWriteType::POINTER_ARRAY) @@ -399,8 +402,7 @@ class ZoneWriteTemplate::Internal final : BaseTemplate void WriteMember_InsertReuse(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberWriteType writeType) { - if (!WriteMember_ShouldMakeInsertReuse(info, member, modifier, writeType) - || !member->m_is_reusable) + if (!WriteMember_ShouldMakeInsertReuse(info, member, modifier, writeType)) { WriteMember_TypeCheck(info, member, modifier, writeType); return; @@ -487,13 +489,12 @@ class ZoneWriteTemplate::Internal final : BaseTemplate return false; } - return true; + return member->m_is_reusable; } void WriteMember_Reuse(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberWriteType writeType) { - if (!WriteMember_ShouldMakeReuse(info, member, modifier, writeType) - || !member->m_is_reusable) + if (!WriteMember_ShouldMakeReuse(info, member, modifier, writeType)) { WriteMember_Align(info, member, modifier, writeType); return; diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp index da9366a2..cc48213b 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/UsagesPostProcessor.cpp @@ -48,6 +48,9 @@ bool UsagesPostProcessor::ProcessAsset(StructureInformation* info) if (computations.IsNotInDefaultNormalBlock()) member->m_type->m_reference_from_non_default_normal_block_exists = true; + if (member->m_is_reusable) + member->m_type->m_reusable_reference_exists = true; + member->m_type->m_usages.push_back(currentStructure); processingQueue.push(member->m_type); }