private void CalculateStructSize(BfsSourceRange range, IBfsStructType structtype)
{
int totalstructsize = 0;
foreach (BfsStructField field in structtype.StructFieldList)
{
if (field.PrimitiveType.ArrayExtension == null)
totalstructsize += Environments.GetSizeOfPrimitiveType(field.PrimitiveType);
else
if (field.PrimitiveType.ArrayExtension is BfsKnownArray)
{
BfsKnownArray known = field.PrimitiveType.ArrayExtension as BfsKnownArray;
BfsExpGroup expgroup = known.Expression.ExpressionGroup;
if (expgroup.Members.Count == 1 && expgroup.Members[0] is BfsNumberExp)
{
totalstructsize += Environments.GetSizeOfPrimitiveType(field.PrimitiveType)
* (int)(expgroup.Members[0] as BfsNumberExp).Value;
//BfsCompiler.ReportMessage("Known array of size: " + (expgroup.Members[0] as BfsNumberExp).Value);
}
else
BfsCompiler.ReportError(range,
"Could not get size of block '"+structtype.Name+"' as it has a field with non-simple array-extension.");
}
else
{
totalstructsize = 0;
BfsCompiler.ReportError(range,
"Cannot get size of a block with unknown size (because of array extension in: '" + structtype.Name + "." + field.Name + "')");
break;
}
}
structtype.SizeInBytes = totalstructsize;
//BfsCompiler.ReportWarning(structtype.SourceRange, "Total size of struct: "+ totalstructsize);
}