From a8c62de0816160de19842ca1824c2d45256ce99f Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 8 May 2021 16:41:42 +0200 Subject: [PATCH] Add written variable for zone writing code to be able to differ between written data and original data --- .../Templates/Internal/BaseTemplate.cpp | 39 +++++ .../Templates/Internal/BaseTemplate.h | 5 + .../Templates/ZoneWriteTemplate.cpp | 145 ++++++++++-------- src/ZoneWriting/Writing/AssetWriter.cpp | 14 +- src/ZoneWriting/Writing/AssetWriter.h | 1 + src/ZoneWriting/Writing/ContentWriterBase.cpp | 30 ++-- src/ZoneWriting/Writing/ContentWriterBase.h | 1 + 7 files changed, 159 insertions(+), 76 deletions(-) diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.cpp index 57b8f6d4..8c5a51f3 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.cpp @@ -52,6 +52,13 @@ void BaseTemplate::MakeTypeVarNameInternal(const DataDefinition* def, std::ostri MakeSafeTypeNameInternal(def, str); } +void BaseTemplate::MakeTypeWrittenVarNameInternal(const DataDefinition* def, std::ostringstream& str) +{ + str << "var"; + MakeSafeTypeNameInternal(def, str); + str << "Written"; +} + void BaseTemplate::MakeTypePtrVarNameInternal(const DataDefinition* def, std::ostringstream& str) { str << "var"; @@ -59,6 +66,13 @@ void BaseTemplate::MakeTypePtrVarNameInternal(const DataDefinition* def, std::os str << "Ptr"; } +void BaseTemplate::MakeTypeWrittenPtrVarNameInternal(const DataDefinition* def, std::ostringstream& str) +{ + str << "var"; + MakeSafeTypeNameInternal(def, str); + str << "PtrWritten"; +} + void BaseTemplate::MakeArrayIndicesInternal(const DeclarationModifierComputations& modifierComputations, std::ostringstream& str) { for (auto index : modifierComputations.GetArrayIndices()) @@ -74,6 +88,14 @@ std::string BaseTemplate::MakeTypeVarName(const DataDefinition* def) return str.str(); } + +std::string BaseTemplate::MakeTypeWrittenVarName(const DataDefinition* def) +{ + std::ostringstream str; + MakeTypeWrittenVarNameInternal(def, str); + return str.str(); +} + std::string BaseTemplate::MakeTypePtrVarName(const DataDefinition* def) { std::ostringstream str; @@ -81,6 +103,13 @@ std::string BaseTemplate::MakeTypePtrVarName(const DataDefinition* def) return str.str(); } +std::string BaseTemplate::MakeTypeWrittenPtrVarName(const DataDefinition* def) +{ + std::ostringstream str; + MakeTypeWrittenPtrVarNameInternal(def, str); + return str.str(); +} + std::string BaseTemplate::MakeSafeTypeName(const DataDefinition* def) { std::ostringstream str; @@ -98,6 +127,16 @@ std::string BaseTemplate::MakeMemberAccess(StructureInformation* info, MemberInf return str.str(); } +std::string BaseTemplate::MakeWrittenMemberAccess(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) +{ + std::ostringstream str; + MakeTypeWrittenVarNameInternal(info->m_definition, str); + str << "->" << member->m_member->m_name; + MakeArrayIndicesInternal(modifier, str); + + return str.str(); +} + std::string BaseTemplate::MakeMemberAccess(const std::string& variableName, StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) { std::ostringstream str; diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.h b/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.h index 8b478cb6..074c3ddd 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.h +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/Internal/BaseTemplate.h @@ -26,7 +26,9 @@ protected: private: static void MakeSafeTypeNameInternal(const DataDefinition* def, std::ostringstream& str); static void MakeTypeVarNameInternal(const DataDefinition* def, std::ostringstream& str); + static void MakeTypeWrittenVarNameInternal(const DataDefinition* def, std::ostringstream& str); static void MakeTypePtrVarNameInternal(const DataDefinition* def, std::ostringstream& str); + static void MakeTypeWrittenPtrVarNameInternal(const DataDefinition* def, std::ostringstream& str); static void MakeArrayIndicesInternal(const DeclarationModifierComputations& modifierComputations, std::ostringstream& str); static void MakeOperandStatic(const OperandStatic* op, std::ostringstream& str); static void MakeOperandDynamic(const OperandDynamic* op, std::ostringstream& str); @@ -37,9 +39,12 @@ protected: static std::string Upper(std::string str); static std::string Lower(std::string str); static std::string MakeTypeVarName(const DataDefinition* def); + static std::string MakeTypeWrittenVarName(const DataDefinition* def); static std::string MakeTypePtrVarName(const DataDefinition* def); + static std::string MakeTypeWrittenPtrVarName(const DataDefinition* def); static std::string MakeSafeTypeName(const DataDefinition* def); static std::string MakeMemberAccess(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier); + static std::string MakeWrittenMemberAccess(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier); static std::string MakeMemberAccess(const std::string& variableName, StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier); static std::string MakeTypeDecl(const TypeDeclaration* decl); static std::string MakeFollowingReferences(const std::vector& modifiers); diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp index 443faf40..82c03775 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp @@ -1,11 +1,9 @@ #include "ZoneWriteTemplate.h" - #include #include #include - #include "Domain/Computations/StructureComputations.h" #include "Internal/BaseTemplate.h" @@ -35,6 +33,13 @@ class ZoneWriteTemplate::Internal final : BaseTemplate return str.str(); } + static std::string WrittenVariableDecl(const DataDefinition* def) + { + std::ostringstream str; + str << def->GetFullName() << "* var" << MakeSafeTypeName(def) << "Written;"; + return str.str(); + } + static std::string PointerVariableDecl(const DataDefinition* def) { std::ostringstream str; @@ -42,6 +47,13 @@ class ZoneWriteTemplate::Internal final : BaseTemplate return str.str(); } + static std::string WrittenPointerVariableDecl(const DataDefinition* def) + { + std::ostringstream str; + str << def->GetFullName() << "** var" << MakeSafeTypeName(def) << "PtrWritten;"; + return str.str(); + } + void PrintHeaderPtrArrayWriteMethodDeclaration(const DataDefinition* def) const { LINE("void WritePtrArray_" << MakeSafeTypeName(def) << "(bool atStreamStart, size_t count);") @@ -82,11 +94,21 @@ class ZoneWriteTemplate::Internal final : BaseTemplate LINE("var" << def->m_name << " = nullptr;") } + void PrintWrittenVariableInitialization(const DataDefinition* def) const + { + LINE("var" << def->m_name << "Written = nullptr;") + } + void PrintPointerVariableInitialization(const DataDefinition* def) const { LINE("var" << def->m_name << "Ptr = nullptr;") } + void PrintWrittenPointerVariableInitialization(const DataDefinition* def) const + { + LINE("var" << def->m_name << "PtrWritten = nullptr;") + } + void PrintConstructorMethod() { LINE(WriterClassName(m_env.m_asset) << "::" << WriterClassName(m_env.m_asset) << "("<m_definition->GetFullName()<<"* asset, Zone* zone, IZoneOutputStream* stream)") @@ -100,7 +122,9 @@ class ZoneWriteTemplate::Internal final : BaseTemplate m_intendation++; PrintVariableInitialization(m_env.m_asset->m_definition); + PrintWrittenVariableInitialization(m_env.m_asset->m_definition); PrintPointerVariableInitialization(m_env.m_asset->m_definition); + PrintWrittenPointerVariableInitialization(m_env.m_asset->m_definition); LINE("") for (auto* type : m_env.m_used_types) @@ -108,6 +132,7 @@ class ZoneWriteTemplate::Internal final : BaseTemplate if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) { PrintVariableInitialization(type->m_type); + PrintWrittenVariableInitialization(type->m_type); } } for (auto* type : m_env.m_used_types) @@ -115,6 +140,7 @@ class ZoneWriteTemplate::Internal final : BaseTemplate if (type->m_info && type->m_pointer_array_reference_exists && !type->m_is_context_asset) { PrintPointerVariableInitialization(type->m_type); + PrintWrittenPointerVariableInitialization(type->m_type); } } @@ -128,11 +154,11 @@ class ZoneWriteTemplate::Internal final : BaseTemplate { LINE("varScriptString = " << MakeMemberAccess(info, member, modifier) << ";") LINE("WriteScriptStringArray(true, " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") - LINE("m_stream->MarkFollowing("<MarkFollowing("<(modifier.GetDeclarationModifier())) << ");") } else if (writeType == MemberWriteType::EMBEDDED) @@ -151,7 +177,7 @@ class ZoneWriteTemplate::Internal final : BaseTemplate if (writeType == MemberWriteType::SINGLE_POINTER) { LINE(WriterClassName(member->m_type) << " writer("<m_member->m_type_declaration->m_is_const) { - LINE("varXString = &" << MakeMemberAccess(info, member, modifier) << ";") + LINE("varXStringWritten = &" << MakeWrittenMemberAccess(info, member, modifier) << ";") } else { - LINE("varXString = const_cast(&" << MakeMemberAccess(info, member, modifier) << ");") + LINE("varXStringWritten = const_cast(&" << MakeWrittenMemberAccess(info, member, modifier) << ");") } LINE("WriteXString(false);") } else if (writeType == MemberWriteType::POINTER_ARRAY) { - LINE("varXString = " << MakeMemberAccess(info, member, modifier) << ";") if (modifier.IsArray()) { + LINE("varXStringWritten = " << MakeWrittenMemberAccess(info, member, modifier) << ";") LINE("WriteXStringArray(false, " << modifier.GetArraySize() << ");") } else { + LINE("varXString = " << MakeMemberAccess(info, member, modifier) << ";") LINE("WriteXStringArray(true, " << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") - LINE("m_stream->MarkFollowing(" << MakeMemberAccess("writtenData", info, member, modifier) << ");") + LINE("m_stream->MarkFollowing(" << MakeWrittenMemberAccess(info, member, modifier) << ");") } } else @@ -211,7 +238,7 @@ class ZoneWriteTemplate::Internal final : BaseTemplate LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") } - LINE("m_stream->MarkFollowing(" << MakeMemberAccess("writtenData", info, member, modifier) << ");") + LINE("m_stream->MarkFollowing(" << MakeWrittenMemberAccess(info, member, modifier) << ");") } void WriteMember_PointerArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const @@ -219,12 +246,13 @@ class ZoneWriteTemplate::Internal final : BaseTemplate LINE(MakeTypePtrVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") if (modifier.IsArray()) { + LINE(MakeTypeWrittenPtrVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeWrittenMemberAccess(info, member, modifier) << ";") LINE("WritePtrArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false, " << modifier.GetArraySize() << ");") } else { LINE("WritePtrArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") - LINE("m_stream->MarkFollowing("<MarkFollowing("<m_definition->GetType() == DataDefinitionType::UNION && StructureComputations(info).GetDynamicMember())) - memberAccess = MakeMemberAccess("originalData", info, member, modifier); - else - memberAccess = MakeMemberAccess(info, member, modifier); - if (!member->m_is_leaf) { if (computations.IsAfterPartialLoad()) { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type)<<" = "<m_member->m_type_declaration->m_type)<<" = "<< MakeMemberAccess(info, member, modifier) <<";") LINE("WriteArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " << arraySizeStr << ");") } else { LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") + LINE(MakeTypeWrittenVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeWrittenMemberAccess(info, member, modifier) << ";") LINE("WriteArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false, " << arraySizeStr << ");") } } else if (computations.IsAfterPartialLoad()) { LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) - << ">(" << memberAccess << ", " << arraySizeStr << ");") + << ">(" << MakeMemberAccess(info, member, modifier) << ", " << arraySizeStr << ");") } } void WriteMember_DynamicArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const { - std::string memberAccess; - if (!(info->m_definition->GetType() == DataDefinitionType::UNION && StructureComputations(info).GetDynamicMember())) - memberAccess = MakeMemberAccess("originalData", info, member, modifier); - else - memberAccess = MakeMemberAccess(info, member, modifier); - if (member->m_type && !member->m_type->m_is_leaf) { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << memberAccess << ";") + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") LINE("WriteArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true, " << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") } else { LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) - << ">(" << memberAccess << ", " << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") + << ">(" << MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") } } @@ -288,29 +305,24 @@ class ZoneWriteTemplate::Internal final : BaseTemplate { const MemberComputations computations(member); - std::string memberAccess; - if (!(info->m_definition->GetType() == DataDefinitionType::UNION && StructureComputations(info).GetDynamicMember())) - memberAccess = MakeMemberAccess("originalData", info, member, modifier); - else - memberAccess = MakeMemberAccess(info, member, modifier); - if (!member->m_is_leaf) { if (computations.IsAfterPartialLoad()) { - LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = &" << memberAccess << ";") + LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeMemberAccess(info, member, modifier) << ";") LINE("Write_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(true);") } else { LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeMemberAccess(info, member, modifier) << ";") + LINE(MakeTypeWrittenVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeWrittenMemberAccess(info, member, modifier) << ";") LINE("Write_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false);") } } else if (computations.IsAfterPartialLoad()) { LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) - << ">(&" << memberAccess << ");") + << ">(&" << MakeMemberAccess(info, member, modifier) << ");") } } @@ -327,7 +339,7 @@ class ZoneWriteTemplate::Internal final : BaseTemplate LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier) << ");") } - LINE("m_stream->MarkFollowing(" << MakeMemberAccess("writtenData", info, member, modifier) << ");") + LINE("m_stream->MarkFollowing(" << MakeWrittenMemberAccess(info, member, modifier) << ");") } void WriteMember_TypeCheck(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberWriteType writeType) const @@ -429,7 +441,7 @@ class ZoneWriteTemplate::Internal final : BaseTemplate { const auto* evaluation = modifier.GetPointerArrayCountEvaluation(); - if(evaluation) + if (evaluation) { LINE("m_stream->ReusableAddOffset(" << MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetPointerArrayCountEvaluation()) << ");") } @@ -522,7 +534,7 @@ class ZoneWriteTemplate::Internal final : BaseTemplate return; } - LINE("if(m_stream->ReusableShouldWrite(&" << MakeMemberAccess(info, member, modifier) << "))") + LINE("if(m_stream->ReusableShouldWrite(&" << MakeWrittenMemberAccess(info, member, modifier) << "))") LINE("{") m_intendation++; @@ -761,36 +773,29 @@ class ZoneWriteTemplate::Internal final : BaseTemplate m_intendation++; LINE("assert(" << MakeTypeVarName(info->m_definition) << " != nullptr);") + LINE("") auto* dynamicMember = computations.GetDynamicMember(); if (!(info->m_definition->GetType() == DataDefinitionType::UNION && dynamicMember)) { - LINE("") - - if (dynamicMember) - { - LINE("auto* originalData = "<m_definition)<<";") - } - LINE("if(atStreamStart)") m_intendation++; if (dynamicMember == nullptr) { - LINE(MakeTypeVarName(info->m_definition)<<" = m_stream->Write<" << info->m_definition->GetFullName() << ">(" << MakeTypeVarName(info->m_definition) << "); // Size: " << info-> - m_definition->GetSize()) + LINE(MakeTypeWrittenVarName(info->m_definition)<<" = m_stream->Write<" << info->m_definition->GetFullName() << ">(" << MakeTypeVarName(info->m_definition) << "); // Size: " + << info->m_definition->GetSize()) } else { - LINE(MakeTypeVarName(info->m_definition) << " = m_stream->WritePartial<" << info->m_definition->GetFullName() << ">(" << MakeTypeVarName(info->m_definition) << ", offsetof(" << info-> - m_definition->GetFullName() - << ", " << dynamicMember->m_member->m_name << "));") + LINE(MakeTypeWrittenVarName(info->m_definition) << " = m_stream->WritePartial<" << info->m_definition->GetFullName() << ">(" << MakeTypeVarName(info->m_definition) << ", offsetof(" << + info->m_definition->GetFullName() << ", " << dynamicMember->m_member->m_name << "));") } m_intendation--; LINE("") - LINE("auto* writtenData = "<m_definition)<<";") + LINE("assert(" << MakeTypeWrittenVarName(info->m_definition) << " != nullptr);") } else { @@ -835,16 +840,19 @@ class ZoneWriteTemplate::Internal final : BaseTemplate LINE("if(atStreamStart)") m_intendation++; - LINE(MakeTypePtrVarName(info->m_definition)<<" = m_stream->Write<" << info->m_definition->GetFullName() << "*>(" << MakeTypePtrVarName(info->m_definition) << ");") + LINE(MakeTypeWrittenPtrVarName(info->m_definition)<<" = m_stream->Write<" << info->m_definition->GetFullName() << "*>(" << MakeTypePtrVarName(info->m_definition) << ");") m_intendation--; + LINE("") + LINE("assert(" << MakeTypeWrittenPtrVarName(info->m_definition) << " != nullptr);") + LINE("") if (inTemp) { LINE("m_stream->PushBlock(" << m_env.m_default_temp_block->m_name << ");") LINE("") } - LINE("if(m_stream->ReusableShouldWrite(" << MakeTypePtrVarName(info->m_definition) << "))") + LINE("if(m_stream->ReusableShouldWrite(" << MakeTypeWrittenPtrVarName(info->m_definition) << "))") LINE("{") m_intendation++; @@ -862,7 +870,7 @@ class ZoneWriteTemplate::Internal final : BaseTemplate } LINE("") - LINE("m_stream->MarkFollowing(*"<m_definition)<<");") + LINE("m_stream->MarkFollowing(*"<m_definition)<<");") m_intendation--; LINE("}") @@ -889,6 +897,7 @@ class ZoneWriteTemplate::Internal final : BaseTemplate LINE("") LINE("auto* zoneAsset = static_cast<"<m_definition->GetFullName()<<"*>(m_asset->m_ptr);") LINE(MakeTypePtrVarName(m_env.m_asset->m_definition) << " = &zoneAsset;") + LINE(MakeTypeWrittenPtrVarName(m_env.m_asset->m_definition) << " = &zoneAsset;") LINE("WritePtr_" << MakeSafeTypeName(m_env.m_asset->m_definition) << "(false);") LINE("*pAsset = zoneAsset;") @@ -948,7 +957,7 @@ class ZoneWriteTemplate::Internal final : BaseTemplate { LINE("m_stream->Write<" << def->GetFullName() << ">(*" << MakeTypePtrVarName(def) << ");") } - LINE("m_stream->MarkFollowing(*"<< MakeTypePtrVarName(def)<<");") + LINE("m_stream->MarkFollowing(*"<< MakeTypeWrittenPtrVarName(def)<<");") } void PrintWritePtrArrayMethod_PointerCheck(const DataDefinition* def, StructureInformation* info, const bool reusable) @@ -959,14 +968,14 @@ class ZoneWriteTemplate::Internal final : BaseTemplate if (info && StructureComputations(info).IsAsset()) { - LINE(WriterClassName(info) << " writer(*"<ReusableShouldWrite(" << MakeTypePtrVarName(def) << "))") + LINE("if(m_stream->ReusableShouldWrite(" << MakeTypeWrittenPtrVarName(def) << "))") LINE("{") m_intendation++; @@ -996,19 +1005,25 @@ class ZoneWriteTemplate::Internal final : BaseTemplate LINE("if(atStreamStart)") m_intendation++; - LINE(MakeTypePtrVarName(def)<<" = m_stream->Write<" << def->GetFullName() << "*>(" << MakeTypePtrVarName(def) << ", count);") + LINE(MakeTypeWrittenPtrVarName(def)<<" = m_stream->Write<" << def->GetFullName() << "*>(" << MakeTypePtrVarName(def) << ", count);") m_intendation--; + LINE("") + LINE("assert(" << MakeTypeWrittenPtrVarName(def) << " != nullptr);") + LINE("") LINE(def->GetFullName() << "** var = " << MakeTypePtrVarName(def) << ";") + LINE(def->GetFullName() << "** varWritten = " << MakeTypeWrittenPtrVarName(def) << ";") LINE("for(size_t index = 0; index < count; index++)") LINE("{") m_intendation++; LINE(MakeTypePtrVarName(def) << " = var;") + LINE(MakeTypeWrittenPtrVarName(def) << " = varWritten;") PrintWritePtrArrayMethod_PointerCheck(def, info, reusable); LINE("") LINE("var++;") + LINE("varWritten++;") m_intendation--; LINE("}") @@ -1026,18 +1041,24 @@ class ZoneWriteTemplate::Internal final : BaseTemplate LINE("") LINE("if(atStreamStart)") m_intendation++; - LINE(MakeTypeVarName(def)<<" = m_stream->Write<" << def->GetFullName() << ">(" << MakeTypeVarName(def) << ", count);") + LINE(MakeTypeWrittenVarName(def)<<" = m_stream->Write<" << def->GetFullName() << ">(" << MakeTypeVarName(def) << ", count);") m_intendation--; + LINE("") + LINE("assert(" << MakeTypeWrittenVarName(def) << " != nullptr);") + LINE("") LINE(def->GetFullName() << "* var = " << MakeTypeVarName(def) << ";") + LINE(def->GetFullName() << "* varWritten = " << MakeTypeWrittenVarName(def) << ";") LINE("for(size_t index = 0; index < count; index++)") LINE("{") m_intendation++; LINE(MakeTypeVarName(info->m_definition) << " = var;") + LINE(MakeTypeWrittenVarName(info->m_definition) << " = varWritten;") LINE("Write_" << info->m_definition->m_name << "(false);") LINE("var++;") + LINE("varWritten++;") m_intendation--; LINE("}") @@ -1074,7 +1095,9 @@ public: m_intendation++; LINE(VariableDecl(m_env.m_asset->m_definition)) + LINE(WrittenVariableDecl(m_env.m_asset->m_definition)) LINE(PointerVariableDecl(m_env.m_asset->m_definition)) + LINE(WrittenPointerVariableDecl(m_env.m_asset->m_definition)) LINE("") // Variable Declarations: type varType; @@ -1083,6 +1106,7 @@ public: if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset()) { LINE(VariableDecl(type->m_type)) + LINE(WrittenVariableDecl(type->m_type)) } } for (auto* type : m_env.m_used_types) @@ -1090,6 +1114,7 @@ public: if (type->m_pointer_array_reference_exists && !type->m_is_context_asset) { LINE(PointerVariableDecl(type->m_type)) + LINE(WrittenPointerVariableDecl(type->m_type)) } } diff --git a/src/ZoneWriting/Writing/AssetWriter.cpp b/src/ZoneWriting/Writing/AssetWriter.cpp index 9999d5d5..ec0baae9 100644 --- a/src/ZoneWriting/Writing/AssetWriter.cpp +++ b/src/ZoneWriting/Writing/AssetWriter.cpp @@ -5,7 +5,8 @@ AssetWriter::AssetWriter(XAssetInfoGeneric* asset, Zone* zone, IZoneOutputStream* stream) : ContentWriterBase(zone, stream), m_asset(asset), - varScriptString(nullptr) + varScriptString(nullptr), + varScriptStringWritten(nullptr) { } @@ -22,12 +23,15 @@ scr_string_t AssetWriter::UseScriptString(const scr_string_t scrString) const void AssetWriter::WriteScriptStringArray(const bool atStreamStart, const size_t count) { - assert(varScriptString != nullptr); - if (atStreamStart) - varScriptString = m_stream->Write(varScriptString, count); + { + assert(varScriptString != nullptr); + varScriptStringWritten = m_stream->Write(varScriptString, count); + } - auto* ptr = varScriptString; + assert(varScriptStringWritten != nullptr); + + auto* ptr = varScriptStringWritten; for (size_t index = 0; index < count; index++) { *ptr = UseScriptString(*ptr); diff --git a/src/ZoneWriting/Writing/AssetWriter.h b/src/ZoneWriting/Writing/AssetWriter.h index 6442c878..b074a889 100644 --- a/src/ZoneWriting/Writing/AssetWriter.h +++ b/src/ZoneWriting/Writing/AssetWriter.h @@ -12,6 +12,7 @@ protected: XAssetInfoGeneric* m_asset; scr_string_t* varScriptString; + scr_string_t* varScriptStringWritten; AssetWriter(XAssetInfoGeneric* asset, Zone* zone, IZoneOutputStream* stream); diff --git a/src/ZoneWriting/Writing/ContentWriterBase.cpp b/src/ZoneWriting/Writing/ContentWriterBase.cpp index df86f7ce..668382a7 100644 --- a/src/ZoneWriting/Writing/ContentWriterBase.cpp +++ b/src/ZoneWriting/Writing/ContentWriterBase.cpp @@ -4,6 +4,7 @@ ContentWriterBase::ContentWriterBase() : varXString(nullptr), + varXStringWritten(nullptr), m_zone(nullptr), m_stream(nullptr) { @@ -11,6 +12,7 @@ ContentWriterBase::ContentWriterBase() ContentWriterBase::ContentWriterBase(Zone* zone, IZoneOutputStream* stream) : varXString(nullptr), + varXStringWritten(nullptr), m_zone(zone), m_stream(stream) { @@ -18,31 +20,37 @@ ContentWriterBase::ContentWriterBase(Zone* zone, IZoneOutputStream* stream) void ContentWriterBase::WriteXString(const bool atStreamStart) { - assert(varXString != nullptr); - if (atStreamStart) - varXString = m_stream->Write(varXString); + { + assert(varXString != nullptr); + varXStringWritten = m_stream->Write(varXString); + } - if (m_stream->ReusableShouldWrite(varXString)) + assert(varXStringWritten != nullptr); + + if (m_stream->ReusableShouldWrite(varXStringWritten)) { m_stream->Align(alignof(const char)); - m_stream->ReusableAddOffset(*varXString); - m_stream->WriteNullTerminated(*varXString); + m_stream->ReusableAddOffset(*varXStringWritten); + m_stream->WriteNullTerminated(*varXStringWritten); - m_stream->MarkFollowing(*varXString); + m_stream->MarkFollowing(*varXStringWritten); } } void ContentWriterBase::WriteXStringArray(const bool atStreamStart, const size_t count) { - assert(varXString != nullptr); - if (atStreamStart) - varXString = m_stream->Write(varXString, count); + { + assert(varXString != nullptr); + varXStringWritten = m_stream->Write(varXString, count); + } + + assert(varXStringWritten != nullptr); for (size_t index = 0; index < count; index++) { WriteXString(false); - varXString++; + varXStringWritten++; } } diff --git a/src/ZoneWriting/Writing/ContentWriterBase.h b/src/ZoneWriting/Writing/ContentWriterBase.h index e3e85711..8b752f85 100644 --- a/src/ZoneWriting/Writing/ContentWriterBase.h +++ b/src/ZoneWriting/Writing/ContentWriterBase.h @@ -7,6 +7,7 @@ class ContentWriterBase { protected: const char** varXString; + const char** varXStringWritten; Zone* m_zone; IZoneOutputStream* m_stream;