diff --git a/src/ZoneCodeGenerator/Generating/Templates/Loading/SinglePointer.stg b/src/ZoneCodeGenerator/Generating/Templates/Loading/SinglePointer.stg index 1575cb93..c988f8b5 100644 --- a/src/ZoneCodeGenerator/Generating/Templates/Loading/SinglePointer.stg +++ b/src/ZoneCodeGenerator/Generating/Templates/Loading/SinglePointer.stg @@ -2,28 +2,62 @@ delimiters "$", "$" // Everything related to loading a pointer with a count that is statically 1 -LoadSinglePointerInner(context, structure, member, reference) ::= <% -$TypeVarName(structure.Type)$->$member.Member.Name$ = m_stream->Alloc<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>(alignof($TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$)); -// $member.Member.VariableType.Type.Alignment$ -$\n$ +LoadSinglePointerInner(context, structure, member, reference) ::= << +$if(member.Computations.IsTempBlock)$ +$member.Member.VariableType.Type.FullName$* ptr = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$; +$endif$$\\$ -$if(member.StructureType && !member.StructureType.IsLeaf)$ +$TypeVarName(structure.Type)$->$member.Member.Name$ = m_stream->Alloc<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>(alignof($TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$)); // $member.Member.VariableType.Type.Alignment$ +$\\$ +$\\$ +$if(member.Computations.IsTempBlock)$ +$member.Member.VariableType.Type.FullName$** toInsert = nullptr; +if(ptr == PTR_INSERT) + toInsert = m_stream->InsertPointer<$member.Member.VariableType.Type.FullName$>(); +$endif$$\\$ -$TypeVarName(member.Member.VariableType.Type)$ = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;$\n$ -Load_$member.Member.VariableType.Type.Name$(true); +$if(member.StructureType && !member.StructureType.IsLeaf && !member.Computations.IsRuntimeBlock)$ +$TypeVarName(member.Member.VariableType.Type)$ = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$; +Load_$member.Member.VariableType.Type.Name$(true);$\\$ $else$ +m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$);$\\$ +$endif$$\\$ -m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$); +$if(member.Computations.IsTempBlock)$ +if(toInsert != nullptr) + *toInsert = $TypeVarName(structure.Type)$->$member.Member.Name$;$\\$ $endif$ -%> +>> LoadSinglePointerAsset(context, structure, member, reference) ::= << $LoaderClassName(member.StructureType)$ loader(m_script_string_provider, m_zone, m_stream); loader.Load(&$TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$); >> +LoadSinglePointer_Reuse(context, structure, member, reference) ::= << +$if(member.Computations.IsTempBlock)$ +if($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ == PTR_FOLLOWING || $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ == PTR_INSERT) +{ + $LoadSinglePointerInner(context, structure, member, reference)$ +} +else +{ + $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->ConvertOffsetToAlias($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$); +} +$else$ +if($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ == PTR_FOLLOWING) +{ + $LoadSinglePointerInner(context, structure, member, reference)$ +} +else +{ + $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->ConvertOffsetToPointer($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$); +} +$endif$ +>> + LoadSinglePointer_PointerCheck(context, structure, member, reference) ::= << if ($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$) { @@ -31,14 +65,7 @@ if ($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(refere $LoadSinglePointerAsset(context, structure, member, reference)$ $else$ $if(member.IsReusable)$ - if($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ == PTR_FOLLOWING) - { - $LoadSinglePointerInner(context, structure, member, reference)$ - } - else - { - $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->ConvertOffsetToPointer($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$); - } + $LoadSinglePointer_Reuse(context, structure, member, reference)$ $else$ $LoadSinglePointerInner(context, structure, member, reference)$ $endif$