ZoneCodeGenerator: Fix aligning wrong when custom aligning is set in size calculation

This commit is contained in:
Jan 2020-01-03 17:23:57 +01:00
parent 96f2067030
commit c995a12001
9 changed files with 13 additions and 3 deletions

View File

@ -8,6 +8,7 @@
public string FullName => string.IsNullOrEmpty(Namespace) ? Name : $"{Namespace}::{Name}"; public string FullName => string.IsNullOrEmpty(Namespace) ? Name : $"{Namespace}::{Name}";
public abstract int Alignment { get; } public abstract int Alignment { get; }
public abstract bool ForceAlignment { get; }
public abstract int Size { get; } public abstract int Size { get; }
protected DataType(string _namespace, string name, DataTypeType type) protected DataType(string _namespace, string name, DataTypeType type)

View File

@ -29,6 +29,7 @@ namespace ZoneCodeGenerator.Domain
.Cast<DataTypeBaseType>() .Cast<DataTypeBaseType>()
.ToList(); .ToList();
public override bool ForceAlignment => false;
public override int Size { get; } public override int Size { get; }
public override int Alignment => Size; public override int Alignment => Size;

View File

@ -7,9 +7,11 @@ namespace ZoneCodeGenerator.Domain
public DataTypeBaseType ParentType { get; } public DataTypeBaseType ParentType { get; }
public List<EnumMember> Members { get; } public List<EnumMember> Members { get; }
public override bool ForceAlignment => ParentType.ForceAlignment;
public override int Size => ParentType.Size; public override int Size => ParentType.Size;
public override int Alignment => ParentType.Alignment; public override int Alignment => ParentType.Alignment;
public DataTypeEnum(string _namespace, string name, DataTypeBaseType parentType) : base(_namespace, name, DataTypeType.Enum) public DataTypeEnum(string _namespace, string name, DataTypeBaseType parentType) : base(_namespace, name, DataTypeType.Enum)
{ {
Members = new List<EnumMember>(); Members = new List<EnumMember>();

View File

@ -29,7 +29,7 @@ namespace ZoneCodeGenerator.Domain
currentBitOffset = 0; currentBitOffset = 0;
} }
currentSize = currentSize.Align(Math.Min(member.Alignment, Pack)); currentSize = currentSize.Align(member.ForceAlignment ? member.Alignment : Math.Min(member.Alignment, Pack));
currentSize += member.VariableType.Size; currentSize += member.VariableType.Size;
} }
} }

View File

@ -11,6 +11,7 @@
public int? AlignmentOverride { get; set; } public int? AlignmentOverride { get; set; }
public override int Alignment => AlignmentOverride ?? TypeDefinition.Alignment; public override int Alignment => AlignmentOverride ?? TypeDefinition.Alignment;
public override bool ForceAlignment => AlignmentOverride != null || TypeDefinition.ForceAlignment;
public override int Size => TypeDefinition.Size; public override int Size => TypeDefinition.Size;
public override string ToString() public override string ToString()

View File

@ -8,6 +8,7 @@ namespace ZoneCodeGenerator.Domain
public int? AlignmentOverride { get; set; } public int? AlignmentOverride { get; set; }
private int alignment; private int alignment;
public override int Alignment => AlignmentOverride ?? alignment; public override int Alignment => AlignmentOverride ?? alignment;
public override bool ForceAlignment => AlignmentOverride != null;
private int size; private int size;
public override int Size => size; public override int Size => size;

View File

@ -42,6 +42,8 @@ namespace ZoneCodeGenerator.Domain
} }
public override int Alignment => 0; public override int Alignment => 0;
public override bool ForceAlignment => false;
public override int Size => 0; public override int Size => 0;
} }
} }

View File

@ -20,6 +20,7 @@ namespace ZoneCodeGenerator.Domain
public IReadOnlyList<ReferenceType> References => references.AsReadOnly(); public IReadOnlyList<ReferenceType> References => references.AsReadOnly();
public int Alignment => references.OfType<ReferenceTypePointer>().Any() ? PointerSize : Type.Alignment; public int Alignment => references.OfType<ReferenceTypePointer>().Any() ? PointerSize : Type.Alignment;
public bool ForceAlignment => !references.OfType<ReferenceTypePointer>().Any() && Type.ForceAlignment;
public int Size public int Size
{ {

View File

@ -7,6 +7,7 @@
public int? AlignmentOverride { get; set; } public int? AlignmentOverride { get; set; }
public int Alignment => AlignmentOverride ?? VariableType.Alignment; public int Alignment => AlignmentOverride ?? VariableType.Alignment;
public bool ForceAlignment => AlignmentOverride != null || VariableType.ForceAlignment;
public TypeDeclaration VariableType { get; } public TypeDeclaration VariableType { get; }