ZoneCodeGenerator: Add ability to split loading of a structure due to a dynamic member

This commit is contained in:
Jan 2019-12-22 23:33:00 +01:00
parent 0db6f90980
commit 236108e5fb
8 changed files with 35 additions and 9 deletions

View File

@ -88,10 +88,9 @@ namespace ZoneCodeGenerator.Generating.Computations
.OfType<ReferenceTypeArray>()
.Any(array => array.DynamicSize != null);
public bool IsBarrier => HasDynamicArraySize ||
information.StructureType != null &&
information.StructureType != information.Parent &&
information.StructureType.Computations.Barrier != null;
public bool IsDynamicMember => HasDynamicArraySize ||
!ContainsNonEmbeddedReference &&
information.StructureType?.Computations.DynamicMember != null;
public MemberReferenceComputations References => new MemberReferenceComputations(information);

View File

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

View File

@ -12,8 +12,8 @@ namespace ZoneCodeGenerator.Generating.Computations
public bool IsUsed => information.Usages.Any();
public MemberInformation Barrier =>
information.OrderedMembers.FirstOrDefault(memberInformation => memberInformation.Computations.IsBarrier);
public MemberInformation DynamicMember =>
information.OrderedMembers.FirstOrDefault(memberInformation => memberInformation.Computations.IsDynamicMember);
public StructureComputations(StructureInformation information)
{

View File

@ -4,7 +4,7 @@ delimiters "$", "$"
LoadEmbedded_Load(context, structure, member, reference) ::= <<
$TypeVarName(member.Member.VariableType.Type)$ = &$TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;
Load_$member.Member.VariableType.Type.Name$(false);
Load_$member.Member.VariableType.Type.Name$($if(member.Computations.IsDynamicMember)$true$else$false$endif$);
>>
LoadEmbedded_TypeCheck(context, structure, member, reference) ::= <%

View File

@ -81,7 +81,9 @@ $LoadMemberReference(context, structure, member, entry)$}$
>>
LoadMemberReference(context, structure, member, reference) ::= <%
$if(reference.IsSinglePointer)$
$if(reference.IsDynamicArray)$
// Dynamic array $member.Member.Name$
$elseif(reference.IsSinglePointer)$
$LoadSinglePointer(context, structure, member, reference)$
$elseif(reference.IsArrayPointer)$
$LoadArrayPointer(context, structure, member, reference)$
@ -164,6 +166,8 @@ $elseif(member.Computations.ContainsNonEmbeddedReference)$
$LoadMemberCondition(context, structure, member)$
$elseif(member.StructureType && !member.StructureType.IsLeaf)$
$LoadMemberCondition(context, structure, member)$
$elseif(member.Computations.IsDynamicMember)$
$LoadMemberCondition(context, structure, member)$
$endif$
$endif$
@ -238,10 +242,17 @@ void $LoaderClassName(context.Asset)$::LoadArray_$type.Name$(const bool atStream
LoadMethod(context, structure) ::= <<
void $LoaderClassName(context.Asset)$::Load_$structure.Type.Name$(const bool atStreamStart)
{
assert($TypeVarName(structure.Type)$ != nullptr);
assert($TypeVarName(structure.Type)$ != nullptr);$\\$
$if(!(structure.IsUnion && structure.Computations.DynamicMember))$
if(atStreamStart)
$if(!structure.Computations.DynamicMember)$
m_stream->Load<$structure.Type.FullName$>($TypeVarName(structure.Type)$);$\\$
$else$
m_stream->LoadPartial<$structure.Type.FullName$>($TypeVarName(structure.Type)$, offsetof($structure.Type.FullName$, $structure.Computations.DynamicMember.Member.Name$));$\\$
$endif$
$endif$
$if(structure.ReferenceFromNonDefaultNormalBlockExists || structure.IsAsset)$
m_stream->PushBlock($context.DefaultNormalBlock.Name$);$\\$

View File

@ -32,6 +32,10 @@ namespace ZoneCodeGenerator.Parsing.CommandFile.PostProcessor
if (!hasNoPointerMembers)
return false;
// If the member has an embedded type with dynamic size
if (member.Computations.HasDynamicArraySize)
return false;
if (member.StructureType != null
&& member.StructureType != structureInformation
&& !IsLeaf(member.StructureType))

View File

@ -29,6 +29,9 @@ namespace ZoneCodeGenerator.Parsing.CommandFile.PostProcessor
if (!hasNoPointerMembers)
return false;
if (member.Computations.HasDynamicArraySize)
return false;
return true;
}

View File

@ -31,6 +31,12 @@ public:
LoadDataInBlock(const_cast<void*>(reinterpret_cast<const void*>(dst)), count * sizeof(T));
}
template<typename T>
void LoadPartial(T* dst, const size_t size)
{
LoadDataInBlock(const_cast<void*>(reinterpret_cast<const void*>(dst)), size);
}
virtual void** InsertPointer() = 0;
template<typename T>
T** InsertPointer()