Save offset for reusing for any type that has a reusable reference

This commit is contained in:
Jan 2021-03-20 16:04:17 +01:00
parent 5cd5ae5533
commit 1d33cf2adf
4 changed files with 11 additions and 5 deletions

View File

@ -9,6 +9,7 @@ StructureInformation::StructureInformation(DefinitionWithMembers* definition)
m_array_pointer_reference_exists(false), m_array_pointer_reference_exists(false),
m_array_reference_exists(false), m_array_reference_exists(false),
m_reference_from_non_default_normal_block_exists(false), m_reference_from_non_default_normal_block_exists(false),
m_reusable_reference_exists(false),
m_post_load_action(nullptr), m_post_load_action(nullptr),
m_block(nullptr) m_block(nullptr)
{ {

View File

@ -24,6 +24,7 @@ public:
bool m_array_pointer_reference_exists; bool m_array_pointer_reference_exists;
bool m_array_reference_exists; bool m_array_reference_exists;
bool m_reference_from_non_default_normal_block_exists; bool m_reference_from_non_default_normal_block_exists;
bool m_reusable_reference_exists;
std::unique_ptr<CustomAction> m_post_load_action; std::unique_ptr<CustomAction> m_post_load_action;
const FastFileBlock* m_block; const FastFileBlock* m_block;

View File

@ -381,6 +381,9 @@ class ZoneWriteTemplate::Internal final : BaseTemplate
static bool WriteMember_ShouldMakeInsertReuse(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberWriteType writeType) 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 if (writeType != MemberWriteType::ARRAY_POINTER
&& writeType != MemberWriteType::SINGLE_POINTER && writeType != MemberWriteType::SINGLE_POINTER
&& writeType != MemberWriteType::POINTER_ARRAY) && 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) void WriteMember_InsertReuse(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberWriteType writeType)
{ {
if (!WriteMember_ShouldMakeInsertReuse(info, member, modifier, writeType) if (!WriteMember_ShouldMakeInsertReuse(info, member, modifier, writeType))
|| !member->m_is_reusable)
{ {
WriteMember_TypeCheck(info, member, modifier, writeType); WriteMember_TypeCheck(info, member, modifier, writeType);
return; return;
@ -487,13 +489,12 @@ class ZoneWriteTemplate::Internal final : BaseTemplate
return false; return false;
} }
return true; return member->m_is_reusable;
} }
void WriteMember_Reuse(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberWriteType writeType) void WriteMember_Reuse(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberWriteType writeType)
{ {
if (!WriteMember_ShouldMakeReuse(info, member, modifier, writeType) if (!WriteMember_ShouldMakeReuse(info, member, modifier, writeType))
|| !member->m_is_reusable)
{ {
WriteMember_Align(info, member, modifier, writeType); WriteMember_Align(info, member, modifier, writeType);
return; return;

View File

@ -48,6 +48,9 @@ bool UsagesPostProcessor::ProcessAsset(StructureInformation* info)
if (computations.IsNotInDefaultNormalBlock()) if (computations.IsNotInDefaultNormalBlock())
member->m_type->m_reference_from_non_default_normal_block_exists = true; 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); member->m_type->m_usages.push_back(currentStructure);
processingQueue.push(member->m_type); processingQueue.push(member->m_type);
} }