# HG changeset patch # User Tassilo Philipp # Date 1578088100 -3600 # Node ID ee2b6e54b0747f6540156e943e1eef79d10dd4e1 # Parent 168092290cae0add3f9852cfaf047c75d70b2bc2 - minor refactoring for clarity diff -r 168092290cae -r ee2b6e54b074 dyncall/dyncall_struct.c --- a/dyncall/dyncall_struct.c Tue Dec 03 23:49:59 2019 +0100 +++ b/dyncall/dyncall_struct.c Fri Jan 03 22:48:20 2020 +0100 @@ -54,7 +54,7 @@ return; } assert(s && s->pCurrentStruct); - assert(s->pCurrentStruct->nextField <= (DCint)s->pCurrentStruct->fieldCount - 1); + assert(s->pCurrentStruct->nextField < (DCint)s->pCurrentStruct->fieldCount); f = s->pCurrentStruct->pFields + (s->pCurrentStruct->nextField++); f->type = type; f->alignment = alignment; @@ -107,6 +107,8 @@ { DCsize i; assert(s); + + /* compute field sizes and alignments, recurse if needed */ for (i = 0; i < s->fieldCount; i++) { DCfield *f = s->pFields + i; DCsize fieldAlignment; @@ -114,19 +116,23 @@ dcComputeStructSize(f->pSubStruct); f->size = f->pSubStruct->size; fieldAlignment = f->pSubStruct->alignment; - } else { + } else fieldAlignment = f->size; - } + if (!f->alignment) f->alignment = fieldAlignment; - + + /* if field alignment > struct alignment, choose former */ if (f->alignment > s->alignment) s->alignment = f->alignment; - + + /* if array, it's x times the size */ f->size *= f->arrayLength; - + /*printf("FIELD %d, size = %d, alignment = %d\n", (int)i, (int)f->size, (int)f->alignment);@@@*/ } + + /* compute overall struct size */ for (i = 0; i < s->fieldCount; i++) { DCfield *f = s->pFields + i; dcAlign(&s->size, f->alignment); diff -r 168092290cae -r ee2b6e54b074 dyncall/dyncall_struct.h --- a/dyncall/dyncall_struct.h Tue Dec 03 23:49:59 2019 +0100 +++ b/dyncall/dyncall_struct.h Fri Jan 03 22:48:20 2020 +0100 @@ -53,7 +53,7 @@ DCsize size, alignment, fieldCount; /* struct building uses a state machine. */ - DCint nextField; /* == -1 if struct is closed */ + DCint nextField; /* == -1 if struct is closed */ DCstruct *pCurrentStruct, *pLastStruct; /* == this, unless we're in a sub struct */ };