aboutsummaryrefslogtreecommitdiff
path: root/src/lj_cparse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_cparse.c')
-rw-r--r--src/lj_cparse.c9
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)