diff options
Diffstat (limited to 'src/lj_cparse.c')
| -rw-r--r-- | src/lj_cparse.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/lj_cparse.c b/src/lj_cparse.c index a1361a128..56e3e8491 100644 --- a/src/lj_cparse.c +++ b/src/lj_cparse.c | |||
| @@ -1309,14 +1309,16 @@ static void cp_struct_layout(CPState *cp, CTypeID sid, CTInfo sattr) | |||
| 1309 | align = ctype_align(attr); | 1309 | align = ctype_align(attr); |
| 1310 | if (cp->packstack[cp->curpack] < align) | 1310 | if (cp->packstack[cp->curpack] < align) |
| 1311 | align = cp->packstack[cp->curpack]; | 1311 | align = cp->packstack[cp->curpack]; |
| 1312 | if (align > maxalign) maxalign = align; | 1312 | bsz = ctype_bitcsz(ct->info); /* Bitfield size (temp.). */ |
| 1313 | if (align > maxalign && bsz) maxalign = align; | ||
| 1313 | amask = (8u << align) - 1; | 1314 | amask = (8u << align) - 1; |
| 1314 | 1315 | ||
| 1315 | bsz = ctype_bitcsz(ct->info); /* Bitfield size (temp.). */ | ||
| 1316 | if (bsz == CTBSZ_FIELD || !ctype_isfield(ct->info)) { | 1316 | if (bsz == CTBSZ_FIELD || !ctype_isfield(ct->info)) { |
| 1317 | bsz = csz; /* Regular fields or subtypes always fill the container. */ | 1317 | bsz = csz; /* Regular fields or subtypes always fill the container. */ |
| 1318 | bofs = (bofs + amask) & ~amask; /* Start new aligned field. */ | 1318 | bofs = (bofs + amask) & ~amask; /* Start new aligned field. */ |
| 1319 | ct->size = (bofs >> 3); /* Store field offset. */ | 1319 | ct->size = (bofs >> 3); /* Store field offset. */ |
| 1320 | if (ctype_isfield(ct->info)) | ||
| 1321 | ct->info = CTINFO(CT_FIELD, ctype_cid(ct->info)) + CTALIGN(align); | ||
| 1320 | } else { /* Bitfield. */ | 1322 | } else { /* Bitfield. */ |
| 1321 | if (bsz == 0 || (attr & CTFP_ALIGNED) || | 1323 | if (bsz == 0 || (attr & CTFP_ALIGNED) || |
| 1322 | (!((attr|sattr) & CTFP_PACKED) && (bofs & amask) + bsz > csz)) | 1324 | (!((attr|sattr) & CTFP_PACKED) && (bofs & amask) + bsz > csz)) |
| @@ -1324,7 +1326,8 @@ static void cp_struct_layout(CPState *cp, CTypeID sid, CTInfo sattr) | |||
| 1324 | 1326 | ||
| 1325 | /* Prefer regular field over bitfield. */ | 1327 | /* Prefer regular field over bitfield. */ |
| 1326 | if (bsz == csz && (bofs & amask) == 0) { | 1328 | if (bsz == csz && (bofs & amask) == 0) { |
| 1327 | ct->info = CTINFO(CT_FIELD, ctype_cid(ct->info)); | 1329 | ct->info = CTINFO(CT_FIELD, ctype_cid(ct->info)) + |
| 1330 | CTALIGN(lj_fls(sz)); | ||
| 1328 | ct->size = (bofs >> 3); /* Store field offset. */ | 1331 | ct->size = (bofs >> 3); /* Store field offset. */ |
| 1329 | } else { | 1332 | } else { |
| 1330 | if (csz > amask+1 && bsz <= amask+1) | 1333 | if (csz > amask+1 && bsz <= amask+1) |
