ZoneCodeGenerator: Make unions work with conditions and only load one union member at a time consistently

This commit is contained in:
Jan
2019-12-06 16:33:05 +01:00
parent f4a2639e30
commit 9253ac14fa
9 changed files with 196 additions and 17 deletions

View File

@ -79,35 +79,86 @@ Loading member $member.Member.Name$
LoadMemberReference(context, structure, member, reference) ::= <%
$if(reference.IsSinglePointer)$
$\n$$\n$
$LoadSinglePointer(context, structure, member, reference)$
$elseif(reference.IsArrayPointer)$
$\n$$\n$
$LoadArrayPointer(context, structure, member, reference)$
$elseif(reference.IsPointerArray)$
$\n$$\n$
$LoadPointerArray(context, structure, member, reference)$
$elseif(reference.IsArray && !reference.NextReference)$
$\n$$\n$
$LoadEmbeddedArray(context, structure, member, reference)$
$elseif(!reference.Reference)$
$\n$$\n$
$LoadEmbedded(context, structure, member, reference)$
$else$
$\n$$\n$
// $member.Member.Name$
$endif$
%>
LoadMemberCondition_Struct(context, structure, member) ::= <<
$if(member.Condition)$
if($PrintEvaluation(member.Condition)$)
{
$LoadMemberReference(context, structure, member, member.Computations.References)$
}$\\$
$else$
$LoadMemberReference(context, structure, member, member.Computations.References)$$\\$
$endif$
>>
LoadMemberCondition_Union(context, structure, member) ::= <<
$if(member.Computations.IsFirstMember)$$\\$
$if(member.Condition)$
if($PrintEvaluation(member.Condition)$)
{
$LoadMemberReference(context, structure, member, member.Computations.References)$
}$\\$
$else$
$LoadMemberReference(context, structure, member, member.Computations.References)$$\\$
$endif$$\\$
$elseif(member.Computations.IsLastMember)$$\\$
$if(member.Condition)$
else if($PrintEvaluation(member.Condition)$)
{
$LoadMemberReference(context, structure, member, member.Computations.References)$
}$\\$
$else$
else
{
$LoadMemberReference(context, structure, member, member.Computations.References)$
}$\\$
$endif$$\\$
$else$$\\$
$if(member.Condition)$
else if($PrintEvaluation(member.Condition)$)
{
$LoadMemberReference(context, structure, member, member.Computations.References)$
}$\\$
$else$$\\$
#error Middle member of union must have condition ($member.Member.Name$)
$endif$$\\$
$endif$
>>
LoadMemberCondition(context, structure, member) ::= <%
$if(structure.IsUnion)$
$LoadMemberCondition_Union(context, structure, member)$
$else$
$LoadMemberCondition_Struct(context, structure, member)$
$endif$
%>
LoadMemberIfNeedsTreatment(context, structure, member) ::= <%
$if(!member.Computations.ShouldIgnore)$
$if(member.IsString || member.IsScriptString)$
$LoadMemberReference(context, structure, member, member.Computations.References)$
$LoadMemberCondition(context, structure, member)$
$elseif(member.Computations.ContainsNonEmbeddedReference)$
$LoadMemberReference(context, structure, member, member.Computations.References)$
$LoadMemberCondition(context, structure, member)$
$elseif(member.StructureType && !member.StructureType.IsLeaf)$
$LoadMemberReference(context, structure, member, member.Computations.References)$
$LoadMemberCondition(context, structure, member)$
$endif$
$endif$