ZoneCodeGenerator: Add loading of dynamic arrays

This commit is contained in:
Jan 2019-12-23 17:05:38 +01:00
parent 2fea7654a9
commit 1544bbbd18
5 changed files with 58 additions and 17 deletions

View File

@ -76,13 +76,15 @@ namespace ZoneCodeGenerator.Generating.Computations
public bool IsTempBlock => information.Block != null && information.Block.IsTemp; public bool IsTempBlock => information.Block != null && information.Block.IsTemp;
public bool IsRuntimeBlock => information.Block != null && information.Block.IsRuntime; public bool IsRuntimeBlock => information.Block != null && information.Block.IsRuntime;
public bool IsFirstMember => private IEnumerable<MemberInformation> ParentUsedMembers =>
information.Parent.OrderedMembers.FirstOrDefault(member => information.Parent.IsUnion && information.Parent.Computations.DynamicMember != null
!member.IsLeaf && !member.Computations.ShouldIgnore) == information; ? information.Parent.OrderedMembers.Where(member => !member.Computations.ShouldIgnore)
: information.Parent.OrderedMembers.Where(member =>
!member.IsLeaf && !member.Computations.ShouldIgnore);
public bool IsLastMember => public bool IsFirstMember => ParentUsedMembers.FirstOrDefault() == information;
information.Parent.OrderedMembers.LastOrDefault(member =>
!member.IsLeaf && !member.Computations.ShouldIgnore) == information; public bool IsLastMember => ParentUsedMembers.LastOrDefault() == information;
public bool HasDynamicArraySize => information.Member.VariableType.References public bool HasDynamicArraySize => information.Member.VariableType.References
.OfType<ReferenceTypeArray>() .OfType<ReferenceTypeArray>()
@ -92,6 +94,10 @@ namespace ZoneCodeGenerator.Generating.Computations
!ContainsNonEmbeddedReference && !ContainsNonEmbeddedReference &&
information.StructureType?.Computations.DynamicMember != null; information.StructureType?.Computations.DynamicMember != null;
public bool IsAfterPartialLoad => IsDynamicMember ||
information.Parent.IsUnion &&
information.Parent.Computations.DynamicMember != null;
public MemberReferenceComputations References => new MemberReferenceComputations(information); public MemberReferenceComputations References => new MemberReferenceComputations(information);
public MemberComputations(MemberInformation information) public MemberComputations(MemberInformation information)

View File

@ -64,6 +64,10 @@ namespace ZoneCodeGenerator.Generating.Computations
public bool IsDynamicArray => public bool IsDynamicArray =>
Reference is ReferenceTypeArray referenceTypeArray && referenceTypeArray.DynamicSize != null; Reference is ReferenceTypeArray referenceTypeArray && referenceTypeArray.DynamicSize != null;
public IEvaluation DynamicArrayCountEvaluation => Reference is ReferenceTypeArray referenceTypeArray
? referenceTypeArray.DynamicSize
: null;
public MemberReferenceComputations(MemberInformation information) public MemberReferenceComputations(MemberInformation information)
{ {
this.information = information; this.information = information;

View File

@ -0,0 +1,20 @@
delimiters "$", "$"
// Everything related to loading a dynamic array
LoadDynamicArray_Load(context, structure, member, reference) ::= <%
$if(member.StructureType && !member.StructureType.IsLeaf)$
$TypeVarName(member.Member.VariableType.Type)$ = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;$\n$
LoadArray_$member.Member.VariableType.Type.Name$(true, $PrintEvaluation(reference.DynamicArrayCountEvaluation)$);
$else$
m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$, $PrintEvaluation(reference.DynamicArrayCountEvaluation)$);
$endif$
%>
LoadDynamicArray(context, structure, member, reference) ::= <%
$LoadDynamicArray_Load(context, structure, member, reference)$
%>

View File

@ -3,8 +3,12 @@ delimiters "$", "$"
// Everything related to loading an embedded reference // Everything related to loading an embedded reference
LoadEmbedded_Load(context, structure, member, reference) ::= << LoadEmbedded_Load(context, structure, member, reference) ::= <<
$if(!member.IsLeaf)$
$TypeVarName(member.Member.VariableType.Type)$ = &$TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$; $TypeVarName(member.Member.VariableType.Type)$ = &$TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;
Load_$member.Member.VariableType.Type.Name$($if(member.Computations.IsDynamicMember)$true$else$false$endif$); Load_$member.Member.VariableType.Type.Name$($if(member.Computations.IsAfterPartialLoad)$true$else$false$endif$);$\\$
$elseif(member.Computations.IsAfterPartialLoad)$
m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>(&$TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$);$\\$
$endif$
>> >>
LoadEmbedded_TypeCheck(context, structure, member, reference) ::= <% LoadEmbedded_TypeCheck(context, structure, member, reference) ::= <%
@ -31,13 +35,21 @@ LoadEmbedded(context, structure, member, reference) ::= <%
$LoadEmbedded_Block(context, structure, member, reference)$ $LoadEmbedded_Block(context, structure, member, reference)$
%> %>
LoadEmbeddedArray_Load(context, structure, member, reference) ::= <<
$if(!member.IsLeaf)$
$TypeVarName(member.Member.VariableType.Type)$ = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;
LoadArray_$member.Member.VariableType.Type.Name$($if(member.Computations.IsAfterPartialLoad)$true$else$false$endif$, $reference.ArraySize$);$\\$
$elseif(member.Computations.IsAfterPartialLoad)$
m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$, $reference.ArraySize$);$\\$
$endif$
>>
LoadEmbeddedArray_TypeCheck(context, structure, member, reference) ::= <% LoadEmbeddedArray_TypeCheck(context, structure, member, reference) ::= <%
$if(member.IsScriptString)$ $if(member.IsScriptString)$
varScriptString = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;$\n$ varScriptString = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;$\n$
LoadScriptStringArray(false, $reference.ArraySize$); LoadScriptStringArray(false, $reference.ArraySize$);
$else$ $else$
$TypeVarName(member.Member.VariableType.Type)$ = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;$\n$ $LoadEmbeddedArray_Load(context, structure, member, reference)$
LoadArray_$member.Member.VariableType.Type.Name$(false, $reference.ArraySize$);
$endif$ $endif$
%> %>

View File

@ -4,6 +4,7 @@ import "Common.stg"
import "Loading/Common.stg" import "Loading/Common.stg"
import "Loading/ArrayPointer.stg" import "Loading/ArrayPointer.stg"
import "Loading/DynamicArray.stg"
import "Loading/Embedded.stg" import "Loading/Embedded.stg"
import "Loading/SinglePointer.stg" import "Loading/SinglePointer.stg"
import "Loading/PointerArray.stg" import "Loading/PointerArray.stg"
@ -82,7 +83,7 @@ $LoadMemberReference(context, structure, member, entry)$}$
LoadMemberReference(context, structure, member, reference) ::= <% LoadMemberReference(context, structure, member, reference) ::= <%
$if(reference.IsDynamicArray)$ $if(reference.IsDynamicArray)$
// Dynamic array $member.Member.Name$ $LoadDynamicArray(context, structure, member, reference)$
$elseif(reference.IsSinglePointer)$ $elseif(reference.IsSinglePointer)$
$LoadSinglePointer(context, structure, member, reference)$ $LoadSinglePointer(context, structure, member, reference)$
$elseif(reference.IsArrayPointer)$ $elseif(reference.IsArrayPointer)$
@ -166,7 +167,7 @@ $elseif(member.Computations.ContainsNonEmbeddedReference)$
$LoadMemberCondition(context, structure, member)$ $LoadMemberCondition(context, structure, member)$
$elseif(member.StructureType && !member.StructureType.IsLeaf)$ $elseif(member.StructureType && !member.StructureType.IsLeaf)$
$LoadMemberCondition(context, structure, member)$ $LoadMemberCondition(context, structure, member)$
$elseif(member.Computations.IsDynamicMember)$ $elseif(member.Computations.IsAfterPartialLoad)$
$LoadMemberCondition(context, structure, member)$ $LoadMemberCondition(context, structure, member)$
$endif$ $endif$
@ -208,11 +209,7 @@ void $LoaderClassName(context.Asset)$::LoadPtr_$structure.Type.Name$(const bool
} }
else else
{ {
$if(structure.Block.IsTemp)$
*$TypePtrVarName(structure.Type)$ = m_stream->ConvertOffsetToAlias(*$TypePtrVarName(structure.Type)$); *$TypePtrVarName(structure.Type)$ = m_stream->ConvertOffsetToAlias(*$TypePtrVarName(structure.Type)$);
$else$
*$TypePtrVarName(structure.Type)$ = m_stream->ConvertOffsetToPointer(*$TypePtrVarName(structure.Type)$);
$endif$
} }
} }
@ -252,13 +249,15 @@ void $LoaderClassName(context.Asset)$::Load_$structure.Type.Name$(const bool atS
$else$ $else$
m_stream->LoadPartial<$structure.Type.FullName$>($TypeVarName(structure.Type)$, offsetof($structure.Type.FullName$, $structure.Computations.DynamicMember.Member.Name$));$\\$ m_stream->LoadPartial<$structure.Type.FullName$>($TypeVarName(structure.Type)$, offsetof($structure.Type.FullName$, $structure.Computations.DynamicMember.Member.Name$));$\\$
$endif$ $endif$
$else$
assert(atStreamStart);$\\$
$endif$ $endif$
$if(structure.ReferenceFromNonDefaultNormalBlockExists || structure.IsAsset)$ $if(structure.IsAsset)$
m_stream->PushBlock($context.DefaultNormalBlock.Name$);$\\$ m_stream->PushBlock($context.DefaultNormalBlock.Name$);$\\$
$endif$ $endif$
$structure.OrderedMembers:{member | $LoadMemberIfNeedsTreatment(context, structure, member)$}$ $structure.OrderedMembers:{member | $LoadMemberIfNeedsTreatment(context, structure, member)$}$
$if(structure.ReferenceFromNonDefaultNormalBlockExists || structure.IsAsset)$ $if(structure.IsAsset)$
m_stream->PopBlock(); m_stream->PopBlock();
$endif$ $endif$