From 4f785700239cd6e16b700abe9df5ecd0ca8f1d24 Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 21 Nov 2019 01:46:41 +0100 Subject: [PATCH] ZoneCodeGenerator: Add embedded reference handling to templates --- .../Computations/MemberComputations.cs | 4 +- .../Generating/Templates/Common.stg | 4 ++ .../Templates/Loading/ArrayPointer.stg | 64 +++++++++++++++---- .../Generating/Templates/Loading/Embedded.stg | 8 +++ .../Templates/Loading/SinglePointer.stg | 29 +++++++-- .../Generating/Templates/ZoneLoad.stg | 6 +- 6 files changed, 94 insertions(+), 21 deletions(-) create mode 100644 src/ZoneCodeGenerator/Generating/Templates/Loading/Embedded.stg diff --git a/src/ZoneCodeGenerator/Generating/Computations/MemberComputations.cs b/src/ZoneCodeGenerator/Generating/Computations/MemberComputations.cs index b18f1397..9bc1e790 100644 --- a/src/ZoneCodeGenerator/Generating/Computations/MemberComputations.cs +++ b/src/ZoneCodeGenerator/Generating/Computations/MemberComputations.cs @@ -14,7 +14,9 @@ namespace ZoneCodeGenerator.Generating.Computations && information.Condition.IsStatic && information.Condition.EvaluateNumeric() == 0; - public bool IsNonEmbeddedReference => information.Member.VariableType.References.OfType().Any(); + public bool IsEmbeddedReference => !information.Member.VariableType.References.OfType().Any(); + + public bool IsNonEmbeddedReference => !IsEmbeddedReference; public bool IsSinglePointerReference => information.Member.VariableType.References.Any() && information.Member.VariableType.References.Last() is ReferenceTypePointer diff --git a/src/ZoneCodeGenerator/Generating/Templates/Common.stg b/src/ZoneCodeGenerator/Generating/Templates/Common.stg index f69876c9..3baa696a 100644 --- a/src/ZoneCodeGenerator/Generating/Templates/Common.stg +++ b/src/ZoneCodeGenerator/Generating/Templates/Common.stg @@ -9,7 +9,11 @@ TypeVarName(structure) ::= "var$structure.Type.Name$" TypePtrVarName(structure) ::= "var$structure.Type.Name$Ptr" PrintOperandStatic(op) ::= <% +$if(op.EnumMemberValue)$ +$op.EnumMemberValue.Name$ +$else$ $op.Value$ +$endif$ %> PrintOperandDynamic(op) ::= <% diff --git a/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg b/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg index 571eca32..ce7715ee 100644 --- a/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg +++ b/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg @@ -1,30 +1,68 @@ // Everything related to loading a pointer with a count that can be larger than 1 -LoadArrayPointerInner(context, structure, member) ::= << -$TypeVarName(structure)$->$member.Member.Name$ = m_stream->Alloc<$TypeDeclaration(member.Member.VariableType)$>(alignof($TypeDeclaration(member.Member.VariableType)$)); -$if(member.StructureType && !member.StructureType.IsLeaf)$ -$TypeVarName(member.StructureType)$ = $TypeVarName(structure)$->$member.Member.Name$; -LoadArray_$member.Member.VariableType.Type.Name$(true, $PrintEvaluation(member.Computations.ArrayPointerCountEvaluation)$); -$else$ -m_stream->Load<$TypeDeclaration(member.Member.VariableType)$>($TypeVarName(structure)$->$member.Member.Name$, $PrintEvaluation(member.Computations.ArrayPointerCountEvaluation)$);$endif$ ->> +LoadArrayPointer_Loading(context, structure, member) ::= <% +$TypeVarName(structure)$->$member.Member.Name$ = m_stream->Alloc<$TypeDeclaration(member.Member.VariableType)$>(alignof($TypeDeclaration(member.Member.VariableType)$));$\n$ -LoadArrayPointer(context, structure, member) ::= << -$if(!member.Computations.ShouldIgnore)$ +$if(member.StructureType && !member.StructureType.IsLeaf)$ + +$TypeVarName(member.StructureType)$ = $TypeVarName(structure)$->$member.Member.Name$;$\n$ +LoadArray_$member.Member.VariableType.Type.Name$(true, $PrintEvaluation(member.Computations.ArrayPointerCountEvaluation)$); + +$else$ + +m_stream->Load<$TypeDeclaration(member.Member.VariableType)$>($TypeVarName(structure)$->$member.Member.Name$, $PrintEvaluation(member.Computations.ArrayPointerCountEvaluation)$); + +$endif$ +%> + +LoadArrayPointer_PointerCheck(context, structure, member) ::= << if ($TypeVarName(structure)$->$member.Member.Name$) { $if(member.IsReusable)$ if($TypeVarName(structure)$->$member.Member.Name$ == PTR_FOLLOWING) { - $LoadArrayPointerInner(context, structure, member)$ + $LoadArrayPointer_Loading(context, structure, member)$ } else { $TypeVarName(structure)$->$member.Member.Name$ = m_stream->ConvertOffsetToPointer($TypeVarName(structure)$->$member.Member.Name$); } $else$ - $LoadArrayPointerInner(context, structure, member)$ + $LoadArrayPointer_Loading(context, structure, member)$ $endif$ } +>> + +LoadArrayPointer_Condition(context, structure, member) ::= <% +$if(member.Condition)$ +$if(structure.IsUnion)$ + +if($PrintEvaluation(member.Condition)$)$\n$ +{$\n$ + $LoadArrayPointer_PointerCheck(context, structure, member)$$\n$ +}$\n$ +$\n$ + +$else$ + +if($PrintEvaluation(member.Condition)$)$\n$ +{$\n$ + $LoadArrayPointer_PointerCheck(context, structure, member)$$\n$ +}$\n$ +$\n$ + $endif$ ->> \ No newline at end of file + +$else$ + +$LoadArrayPointer_PointerCheck(context, structure, member)$$\n$ +$\n$ + +$endif$ +%> + +LoadArrayPointer(context, structure, member) ::= <% +$if(!member.Computations.ShouldIgnore)$ +$LoadArrayPointer_Condition(context, structure, member)$ +$endif$ +%> \ No newline at end of file diff --git a/src/ZoneCodeGenerator/Generating/Templates/Loading/Embedded.stg b/src/ZoneCodeGenerator/Generating/Templates/Loading/Embedded.stg new file mode 100644 index 00000000..e04da2aa --- /dev/null +++ b/src/ZoneCodeGenerator/Generating/Templates/Loading/Embedded.stg @@ -0,0 +1,8 @@ +// Everything related to loading an embedded reference + +LoadEmbedded(context, structure, member) ::= << +$if(!member.Computations.ShouldIgnore)$ +$TypeVarName(member.StructureType)$ = &$TypeVarName(structure)$->$member.Member.Name$; +Load_$member.Member.VariableType.Type.Name$(false); +$endif$ +>> \ 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 05e8898e..4cbd9bd7 100644 --- a/src/ZoneCodeGenerator/Generating/Templates/Loading/SinglePointer.stg +++ b/src/ZoneCodeGenerator/Generating/Templates/Loading/SinglePointer.stg @@ -14,9 +14,7 @@ $LoaderClassName(member.StructureType)$ loader(m_script_string_provider, m_zone, loader.Load(&$TypeVarName(structure)$->$member.Member.Name$); >> -LoadSinglePointer(context, structure, member) ::= << -$if(!member.Computations.ShouldIgnore)$ -$if(!member.Computations.IsArray && member.Computations.PointerDepthIsOne)$ $! TODO: FIX ARRAYS !$ +LoadSinglePointer_PointerCheck(context, structure, member) ::= << if ($TypeVarName(structure)$->$member.Member.Name$) { $if(member.StructureType && member.StructureType.IsAsset)$ @@ -36,6 +34,29 @@ if ($TypeVarName(structure)$->$member.Member.Name$) $endif$ $endif$ } +>> + +LoadSinglePointer_Condition(context, structure, member) ::= <% +$if(member.Condition)$ + +if($PrintEvaluation(member.Condition)$)$\n$ +{$\n$ + $LoadSinglePointer_PointerCheck(context, structure, member)$$\n$ +}$\n$ +$\n$ + +$else$ + +$LoadSinglePointer_PointerCheck(context, structure, member)$$\n$ +$\n$ + +$endif$ +%> + +LoadSinglePointer(context, structure, member) ::= <% +$if(!member.Computations.ShouldIgnore)$ +$if(!member.Computations.IsArray && member.Computations.PointerDepthIsOne)$$! TODO: FIX ARRAYS !$ +$LoadSinglePointer_Condition(context, structure, member)$ $endif$ $endif$ ->> \ No newline at end of file +%> \ No newline at end of file diff --git a/src/ZoneCodeGenerator/Generating/Templates/ZoneLoad.stg b/src/ZoneCodeGenerator/Generating/Templates/ZoneLoad.stg index 299b5eb3..7d96fb03 100644 --- a/src/ZoneCodeGenerator/Generating/Templates/ZoneLoad.stg +++ b/src/ZoneCodeGenerator/Generating/Templates/ZoneLoad.stg @@ -89,7 +89,7 @@ Loading member $member.Member.Name$ >> -LoadMemberIfNeedsTreatment(context, structure, member) ::= << +LoadMemberIfNeedsTreatment(context, structure, member) ::= <% $if(member.IsString)$ $LoadString(context, structure, member)$ $elseif(member.IsScriptString)$ @@ -98,8 +98,9 @@ $elseif(member.Computations.IsArrayPointerReference && member.Computations.Point $LoadArrayPointer(context, structure, member)$ $elseif(member.Computations.IsSinglePointerReference)$ $LoadSinglePointer(context, structure, member)$ +$elseif(member.Computations.IsEmbeddedReference && member.StructureType)$ $endif$ ->> +%> LoadMethod(structure, context) ::= << void $LoaderClassName(context.Asset)$::Load_$structure.Type.Name$(const bool atStreamStart) @@ -115,7 +116,6 @@ void $LoaderClassName(context.Asset)$::Load_$structure.Type.Name$(const bool atS $structure.OrderedMembers:{member | $LoadMemberIfNeedsTreatment(context, structure, member)$}$ $if(structure.Block.IsTemp)$ - m_stream->PopBlock(); $endif$ }