Mercurial > pub > dyncall > dyncall
diff dyncall/dyncall_struct.c @ 338:ee2b6e54b074
- minor refactoring for clarity
author | Tassilo Philipp |
---|---|
date | Fri, 03 Jan 2020 22:48:20 +0100 |
parents | 3e629dc19168 |
children |
line wrap: on
line diff
--- 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);