From f4a2639e305e1cf1849cf3a36d2956c9d2f37426 Mon Sep 17 00:00:00 2001 From: Jan Date: Fri, 6 Dec 2019 16:31:20 +0100 Subject: [PATCH] ZoneCodeGenerator: Make members have a block they are being loaded into instead of structures --- .../Domain/Information/MemberInformation.cs | 2 + .../Information/StructureInformation.cs | 3 +- .../Computations/MemberComputations.cs | 3 ++ .../Generating/RenderingContext.cs | 3 ++ .../Templates/Loading/ArrayPointer.stg | 40 +++++++++++++++++-- .../Generating/Templates/Loading/Embedded.stg | 24 +++++------ .../Templates/Loading/PointerArray.stg | 21 +++++----- .../Templates/Loading/SinglePointer.stg | 22 +++++----- .../Generating/Templates/ZoneLoad.stg | 14 +++---- .../Parsing/CommandFile/CommandFileReader.cs | 1 - .../PostProcessorDefaultBlock.cs | 33 --------------- .../PostProcessor/PostProcessorUsages.cs | 3 ++ .../Parsing/CommandFile/Tests/TestSetBlock.cs | 16 ++++---- 13 files changed, 94 insertions(+), 91 deletions(-) delete mode 100644 src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorDefaultBlock.cs diff --git a/src/ZoneCodeGenerator/Domain/Information/MemberInformation.cs b/src/ZoneCodeGenerator/Domain/Information/MemberInformation.cs index dd3f6414..c79efe73 100644 --- a/src/ZoneCodeGenerator/Domain/Information/MemberInformation.cs +++ b/src/ZoneCodeGenerator/Domain/Information/MemberInformation.cs @@ -13,6 +13,7 @@ namespace ZoneCodeGenerator.Domain.Information public bool IsScriptString { get; set; } public bool IsReusable { get; set; } public IEvaluation Condition { get; set; } + public FastFileBlock Block { get; set; } public MemberComputations Computations => new MemberComputations(this); @@ -24,6 +25,7 @@ namespace ZoneCodeGenerator.Domain.Information IsScriptString = false; IsReusable = false; Condition = null; + Block = null; } public override string ToString() diff --git a/src/ZoneCodeGenerator/Domain/Information/StructureInformation.cs b/src/ZoneCodeGenerator/Domain/Information/StructureInformation.cs index 25abce53..ff3b1a22 100644 --- a/src/ZoneCodeGenerator/Domain/Information/StructureInformation.cs +++ b/src/ZoneCodeGenerator/Domain/Information/StructureInformation.cs @@ -11,7 +11,6 @@ namespace ZoneCodeGenerator.Domain.Information { public DataTypeWithMembers Type { get; } public bool IsUnion => Type is DataTypeUnion; - public FastFileBlock Block { get; set; } public EnumMember AssetEnumEntry { get; set; } public bool IsAsset => AssetEnumEntry != null; @@ -30,6 +29,7 @@ namespace ZoneCodeGenerator.Domain.Information public bool SinglePointerReferenceExists { get; set; } public bool ArrayPointerReferenceExists { get; set; } public bool ArrayReferenceExists { get; set; } + public bool ReferenceFromNonDefaultNormalBlockExists { get; set; } public bool IsLeaf { get; set; } @@ -44,6 +44,7 @@ namespace ZoneCodeGenerator.Domain.Information NonEmbeddedReferenceExists = false; SinglePointerReferenceExists = false; ArrayReferenceExists = false; + ReferenceFromNonDefaultNormalBlockExists = false; Usages = new List(); OrderedMembers = new List(); IsLeaf = true; diff --git a/src/ZoneCodeGenerator/Generating/Computations/MemberComputations.cs b/src/ZoneCodeGenerator/Generating/Computations/MemberComputations.cs index cf13b026..0771921f 100644 --- a/src/ZoneCodeGenerator/Generating/Computations/MemberComputations.cs +++ b/src/ZoneCodeGenerator/Generating/Computations/MemberComputations.cs @@ -70,6 +70,9 @@ namespace ZoneCodeGenerator.Generating.Computations public bool PointerDepthIsOne => PointerDepth == 1; public bool PointerDepthIsTwo => PointerDepth == 2; + public bool IsNotDefaultNormalBlock => + information.Block != null && !(information.Block.IsNormal && information.Block.IsDefault); + public MemberReferenceComputations References => new MemberReferenceComputations(information); public MemberComputations(MemberInformation information) diff --git a/src/ZoneCodeGenerator/Generating/RenderingContext.cs b/src/ZoneCodeGenerator/Generating/RenderingContext.cs index 9149513d..1121074d 100644 --- a/src/ZoneCodeGenerator/Generating/RenderingContext.cs +++ b/src/ZoneCodeGenerator/Generating/RenderingContext.cs @@ -50,6 +50,9 @@ namespace ZoneCodeGenerator.Generating public FastFileBlock DefaultNormalBlock => Blocks.FirstOrDefault(block => block.IsDefault && block.IsNormal) ?? Blocks.FirstOrDefault(block => block.IsNormal); + public FastFileBlock DefaultTempBlock => Blocks.FirstOrDefault(block => block.IsDefault && block.IsTemp) ?? + Blocks.FirstOrDefault(block => block.IsTemp); + private RenderingContext() { usedTypes = new Dictionary(); diff --git a/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg b/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg index f389bdf0..3575d1d1 100644 --- a/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg +++ b/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg @@ -55,9 +55,43 @@ if ($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(refere } >> -LoadArrayPointer_Condition(context, structure, member, reference) ::= << -$if(member.Condition)$$\\$ -if($PrintEvaluation(member.Condition)$) +LoadArrayPointer_Block(context, structure, member, reference) ::= <% +$if(member.Computations.IsNotDefaultNormalBlock)$ +m_stream->PushBlock($member.Block.Name$);$\n$ +$endif$ + +$LoadArrayPointer_PointerCheck(context, structure, member, reference)$ + +$if(member.Computations.IsNotDefaultNormalBlock)$ +$\n$m_stream->PopBlock(); +$endif$ +%> + +LoadArrayPointer(context, structure, member, reference) ::= <% +$LoadArrayPointer_Block(context, structure, member, reference)$ +%> + +LoadPointerArrayMethod_Loading(context, type, structure) ::= <% +*$TypePtrVarName(type)$ = m_stream->Alloc<$type.FullName$>(alignof($type.FullName$)); +// $type.Alignment$ +$\n$ + +$if(structure && !structure.IsLeaf)$ + +$TypeVarName(structure.Type)$ = *$TypePtrVarName(type)$;$\n$ +Load_$type.Name$(true); + +$else$ + +m_stream->Load<$type.FullName$>(*$TypePtrVarName(type)$); + +$endif$ +%> + +LoadPointerArrayMethod_Asset(context, type, structure) ::= << +$LoaderClassName(structure)$ loader(m_script_string_provider, m_zone, m_stream); +loader.Load($TypePtrVarName(type)$); +>> LoadPointerArrayMethod_PointerCheck(context, type, structure, reusable) ::= << if (*$TypePtrVarName(type)$) diff --git a/src/ZoneCodeGenerator/Generating/Templates/Loading/Embedded.stg b/src/ZoneCodeGenerator/Generating/Templates/Loading/Embedded.stg index 2a34f326..58132c8e 100644 --- a/src/ZoneCodeGenerator/Generating/Templates/Loading/Embedded.stg +++ b/src/ZoneCodeGenerator/Generating/Templates/Loading/Embedded.stg @@ -15,22 +15,20 @@ $LoadEmbedded_Load(context, structure, member, reference)$ $endif$ %> -LoadEmbedded_Condition(context, structure, member, reference) ::= << -$if(member.Condition)$ -if($PrintEvaluation(member.Condition)$) -{ - $LoadEmbedded_TypeCheck(context, structure, member, reference)$ - $if(structure.IsUnion)$ - return; - $endif$ -} -$else$$\\$ -$LoadEmbedded_TypeCheck(context, structure, member, reference)$$\\$ +LoadEmbedded_Block(context, structure, member, reference) ::= <% +$if(member.Computations.IsNotDefaultNormalBlock)$ +m_stream->PushBlock($member.Block.Name$);$\n$ $endif$ ->> + +$LoadEmbedded_TypeCheck(context, structure, member, reference)$ + +$if(member.Computations.IsNotDefaultNormalBlock)$ +$\n$m_stream->PopBlock(); +$endif$ +%> LoadEmbedded(context, structure, member, reference) ::= <% -$LoadEmbedded_Condition(context, structure, member, reference)$ +$LoadEmbedded_Block(context, structure, member, reference)$ %> LoadEmbeddedArray_TypeCheck(context, structure, member, reference) ::= <% diff --git a/src/ZoneCodeGenerator/Generating/Templates/Loading/PointerArray.stg b/src/ZoneCodeGenerator/Generating/Templates/Loading/PointerArray.stg index 00a510f5..6a280644 100644 --- a/src/ZoneCodeGenerator/Generating/Templates/Loading/PointerArray.stg +++ b/src/ZoneCodeGenerator/Generating/Templates/Loading/PointerArray.stg @@ -31,17 +31,18 @@ $LoadPointerArray_Loading(context, structure, member, reference)$ $endif$ %> -LoadPointerArray_Condition(context, structure, member, reference) ::= << -$if(member.Condition)$$\\$ -if($PrintEvaluation(member.Condition)$) -{ - $LoadPointerArray_TypeCheck(context, structure, member, reference)$ -} -$else$$\\$ -$LoadPointerArray_TypeCheck(context, structure, member, reference)$$\\$ +LoadPointerArray_Block(context, structure, member, reference) ::= <% +$if(member.Computations.IsNotDefaultNormalBlock)$ +m_stream->PushBlock($member.Block.Name$);$\n$ $endif$ ->> + +$LoadPointerArray_TypeCheck(context, structure, member, reference)$ + +$if(member.Computations.IsNotDefaultNormalBlock)$ +$\n$m_stream->PopBlock(); +$endif$ +%> LoadPointerArray(context, structure, member, reference) ::= <% -$LoadPointerArray_Condition(context, structure, member, reference)$ +$LoadPointerArray_Block(context, structure, member, reference)$ %> \ No newline at end of file diff --git a/src/ZoneCodeGenerator/Generating/Templates/Loading/SinglePointer.stg b/src/ZoneCodeGenerator/Generating/Templates/Loading/SinglePointer.stg index 9a92ae14..1575cb93 100644 --- a/src/ZoneCodeGenerator/Generating/Templates/Loading/SinglePointer.stg +++ b/src/ZoneCodeGenerator/Generating/Templates/Loading/SinglePointer.stg @@ -65,20 +65,18 @@ $LoadSinglePointer_PointerCheck(context, structure, member, reference)$ $endif$ %> -LoadSinglePointer_Condition(context, structure, member, reference) ::= << -$if(member.Condition)$ -if($PrintEvaluation(member.Condition)$) -{ - $LoadSinglePointer_TypeCheck(context, structure, member, reference)$ -} -$if(structure.IsUnion)$ -return; +LoadSinglePointer_Block(context, structure, member, reference) ::= <% +$if(member.Computations.IsNotDefaultNormalBlock)$ +m_stream->PushBlock($member.Block.Name$);$\n$ $endif$ -$else$$\\$ -$LoadSinglePointer_TypeCheck(context, structure, member, reference)$$\\$ + +$LoadSinglePointer_TypeCheck(context, structure, member, reference)$ + +$if(member.Computations.IsNotDefaultNormalBlock)$ +$\n$m_stream->PopBlock(); $endif$ ->> +%> LoadSinglePointer(context, structure, member, reference) ::= <% -$LoadSinglePointer_Condition(context, structure, member, reference)$ +$LoadSinglePointer_Block(context, structure, member, reference)$ %> \ No newline at end of file diff --git a/src/ZoneCodeGenerator/Generating/Templates/ZoneLoad.stg b/src/ZoneCodeGenerator/Generating/Templates/ZoneLoad.stg index 1d27f9ad..96ed4e28 100644 --- a/src/ZoneCodeGenerator/Generating/Templates/ZoneLoad.stg +++ b/src/ZoneCodeGenerator/Generating/Templates/ZoneLoad.stg @@ -13,7 +13,7 @@ LoaderClassName(asset) ::= "Loader_$asset.Type.Name$" HeaderConstructor(context) ::= "$LoaderClassName(context.Asset)$(IZoneScriptStringProvider* scriptStringProvider, Zone* zone, IZoneInputStream* stream);" -HeaderSinglePtrLoadMethodDeclaration(structure) ::= "void LoadPtr_$structure.Type.Name$(bool atStreamStart);" +HeaderTempPtrLoadMethodDeclaration(structure) ::= "void LoadPtr_$structure.Type.Name$(bool atStreamStart);" HeaderArrayLoadMethodDeclaration(type) ::= "void LoadArray_$SafeTypeName(type)$(bool atStreamStart, size_t count);" HeaderPtrArrayLoadMethodDeclaration(type) ::= "void LoadPtrArray_$SafeTypeName(type)$(bool atStreamStart, size_t count);" HeaderLoadMethodDeclaration(structure) ::= "void Load_$structure.Type.Name$(bool atStreamStart);" @@ -62,7 +62,7 @@ namespace $context.Game$ $context.UsedTypes:{usedType | $if(usedType.ArrayReferenceExists && usedType.Information && !usedType.Information.IsLeaf)$$HeaderArrayLoadMethodDeclaration(usedType.Type)$$\n$$endif$}$ $context.UsedStructures:{usedStructure | $if(!usedStructure.IsLeaf && !usedStructure.IsAsset)$$HeaderLoadMethodDeclaration(usedStructure)$$\n$$endif$}$ $HeaderLoadMethodDeclaration(context.Asset)$ - $HeaderSinglePtrLoadMethodDeclaration(context.Asset)$ + $HeaderTempPtrLoadMethodDeclaration(context.Asset)$ $HeaderAssetLoadMethodDeclaration(context.Asset)$ public: @@ -113,7 +113,7 @@ $endif$ $endif$ %> -LoadSinglePtrMethod(context, structure) ::= << +LoadTempPtrMethod(context, structure) ::= << void $LoaderClassName(context.Asset)$::LoadPtr_$structure.Type.Name$(const bool atStreamStart) { assert($TypePtrVarName(structure.Type)$ != nullptr); @@ -121,7 +121,7 @@ void $LoaderClassName(context.Asset)$::LoadPtr_$structure.Type.Name$(const bool if(atStreamStart) m_stream->Load<$structure.Type.FullName$*>($TypePtrVarName(structure.Type)$); - m_stream->PushBlock($structure.Block.Name$); + m_stream->PushBlock($context.DefaultTempBlock.Name$); if(*$TypePtrVarName(structure.Type)$ != nullptr) { @@ -131,12 +131,10 @@ void $LoaderClassName(context.Asset)$::LoadPtr_$structure.Type.Name$(const bool if(*$TypePtrVarName(structure.Type)$ == PTR_FOLLOWING) $endif$ { - $if(structure.Block.IsTemp)$ $structure.Type.FullName$** toInsert = nullptr; if(*$TypePtrVarName(structure.Type)$ == PTR_INSERT) toInsert = m_stream->InsertPointer<$structure.Type.FullName$>(); - $endif$ *$TypePtrVarName(structure.Type)$ = m_stream->Alloc<$structure.Type.FullName$>(alignof($structure.Type.FullName$)); $if(!structure.IsLeaf)$ @@ -147,11 +145,9 @@ void $LoaderClassName(context.Asset)$::LoadPtr_$structure.Type.Name$(const bool $if(structure.IsAsset)$ LoadAsset_$structure.Type.Name$($TypePtrVarName(structure.Type)$); $endif$ - $if(structure.Block.IsTemp)$ if(toInsert != nullptr) *toInsert = *$TypePtrVarName(structure.Type)$; - $endif$ } else { @@ -286,7 +282,7 @@ $context.UsedTypes:{usedType | $if(usedType.ArrayReferenceExists && usedType.Inf $context.UsedStructures:{usedStructure | $if(!usedStructure.IsLeaf && !usedStructure.IsAsset)$$LoadMethod(context, usedStructure)$$\n$$\n$$endif$}$ $LoadMethod(context, context.Asset)$ -$LoadSinglePtrMethod(context, context.Asset)$ +$LoadTempPtrMethod(context, context.Asset)$ $LoadAssetMethod(context, context.Asset)$ diff --git a/src/ZoneCodeGenerator/Parsing/CommandFile/CommandFileReader.cs b/src/ZoneCodeGenerator/Parsing/CommandFile/CommandFileReader.cs index 089376a8..f088ba76 100644 --- a/src/ZoneCodeGenerator/Parsing/CommandFile/CommandFileReader.cs +++ b/src/ZoneCodeGenerator/Parsing/CommandFile/CommandFileReader.cs @@ -13,7 +13,6 @@ namespace ZoneCodeGenerator.Parsing.CommandFile { private static readonly IDataPostProcessor[] postProcessors = { - new PostProcessorDefaultBlock(), new PostProcessorUsages(), new PostProcessorLeafs() }; diff --git a/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorDefaultBlock.cs b/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorDefaultBlock.cs deleted file mode 100644 index 413f3b68..00000000 --- a/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorDefaultBlock.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Linq; -using ZoneCodeGenerator.Domain; -using ZoneCodeGenerator.Domain.FastFileStructure; -using ZoneCodeGenerator.Persistence; - -namespace ZoneCodeGenerator.Parsing.CommandFile.PostProcessor -{ - class PostProcessorDefaultBlock : IDataPostProcessor - { - public bool PostProcess(IDataRepository repository) - { - var memberDataTypes = - repository.GetAllStructs() - .AsEnumerable() - .Concat(repository.GetAllUnions()); - - var defaultTemp = repository.GetAllFastFileBlocks().First(block => block.BlockType == FastFileBlock.Type.Temp && block.IsDefault) ?? - repository.GetAllFastFileBlocks().First(block => block.BlockType == FastFileBlock.Type.Temp); - - var defaultNormal = repository.GetAllFastFileBlocks().First(block => block.BlockType == FastFileBlock.Type.Normal && block.IsDefault) ?? - repository.GetAllFastFileBlocks().First(block => block.BlockType == FastFileBlock.Type.Normal); - - foreach (var memberType in memberDataTypes) - { - var info = repository.GetInformationFor(memberType); - - info.Block = info.IsAsset ? defaultTemp : defaultNormal; - } - - return true; - } - } -} diff --git a/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorUsages.cs b/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorUsages.cs index 084fb13f..5886a141 100644 --- a/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorUsages.cs +++ b/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorUsages.cs @@ -39,6 +39,9 @@ namespace ZoneCodeGenerator.Parsing.CommandFile.PostProcessor if (member.Computations.ContainsArrayReference) member.StructureType.ArrayReferenceExists = true; + if (member.Computations.IsNotDefaultNormalBlock) + member.StructureType.ReferenceFromNonDefaultNormalBlockExists = true; + member.StructureType.Usages.Add(currentStructure); processingQueue.Enqueue(member.StructureType); } diff --git a/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestSetBlock.cs b/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestSetBlock.cs index d15ca01a..f8359fe2 100644 --- a/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestSetBlock.cs +++ b/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestSetBlock.cs @@ -34,14 +34,13 @@ namespace ZoneCodeGenerator.Parsing.CommandFile.Tests { var typeName = NextMatch(TokenTypeName); var typeNameParts = typeName.Split(new[] {"::"}, StringSplitOptions.None); - StructureInformation structure; if (state.DataTypeInUse != null && state.GetMembersFromParts(typeNameParts, state.DataTypeInUse, out var memberList)) { - structure = state.DataTypeInUse; + // Do nothing } - else if (state.GetTypenameAndMembersFromParts(typeNameParts, out structure, out memberList)) + else if (state.GetTypenameAndMembersFromParts(typeNameParts, out _, out memberList)) { // Do nothing } @@ -50,19 +49,18 @@ namespace ZoneCodeGenerator.Parsing.CommandFile.Tests throw new TestFailedException($"Could not find type '{typeName}'."); } - if (memberList.Any()) + if (!memberList.Any()) { - var lastMember = memberList.Last(); - - structure = lastMember.StructureType ?? throw new TestFailedException( - $"Specified member '{lastMember.Member.Name}' is not a structure or union and therefore cannot have its block set."); + throw new TestFailedException("Must specify a member and not a type when setting a block."); } + var member = memberList.Last(); + var blockName = NextMatch(TokenBlockEnumEntry); var block = state.FastFileBlocks .FirstOrDefault(fastFileBlock => fastFileBlock.Name.Equals(blockName)); - structure.Block = + member.Block = block ?? throw new TestFailedException($"Could not find fastfile block with name '{blockName}'"); } }