@@ -282,7 +282,7 @@ static unsigned union_isinlinable(jl_value_t *ty, int pointerfree, size_t *nbyte
282282 size_t sz = jl_datatype_size (ty );
283283 size_t al = jl_datatype_align (ty );
284284 // primitive types in struct slots need their sizes aligned. issue #37974
285- if (asfield && jl_is_primitivetype ( ty ) )
285+ if (asfield )
286286 sz = LLT_ALIGN (sz , al );
287287 if (* nbytes < sz )
288288 * nbytes = sz ;
@@ -465,6 +465,8 @@ void jl_compute_field_offsets(jl_datatype_t *st)
465465 uint32_t fld_npointers = ((jl_datatype_t * )fld )-> layout -> npointers ;
466466 if (((jl_datatype_t * )fld )-> layout -> haspadding )
467467 haspadding = 1 ;
468+ if (jl_datatype_size (fld ) < fsz )
469+ haspadding = 1 ;
468470 if (i >= nfields - st -> name -> n_uninitialized && fld_npointers &&
469471 fld_npointers * sizeof (void * ) != fsz ) {
470472 // field may be undef (may be uninitialized and contains pointer),
@@ -491,8 +493,13 @@ void jl_compute_field_offsets(jl_datatype_t *st)
491493 }
492494 if (isatomic && fsz > MAX_ATOMIC_SIZE )
493495 needlock = 1 ;
494- if (isatomic && fsz <= MAX_ATOMIC_SIZE )
495- al = fsz = next_power_of_two (fsz );
496+ if (isatomic && fsz <= MAX_ATOMIC_SIZE ) {
497+ size_t nfsz = next_power_of_two (fsz );
498+ if (nfsz > fsz ) {
499+ haspadding = 1 ;
500+ }
501+ al = fsz = nfsz ;
502+ }
496503 if (al != 0 ) {
497504 size_t alsz = LLT_ALIGN (sz , al );
498505 if (alsz != sz )
@@ -525,9 +532,7 @@ void jl_compute_field_offsets(jl_datatype_t *st)
525532 if (al > alignm )
526533 alignm = al ;
527534 }
528- st -> size = LLT_ALIGN (sz , alignm );
529- if (st -> size > sz )
530- haspadding = 1 ;
535+ st -> size = sz ;
531536 if (should_malloc && npointers )
532537 pointers = (uint32_t * )malloc_s (npointers * sizeof (uint32_t ));
533538 else
@@ -1470,6 +1475,7 @@ static inline void memassign_safe(int hasptr, jl_value_t *parent, char *dst, con
14701475 memmove_refs ((void * * )dst , (void * * )src , nptr );
14711476 jl_gc_multi_wb (parent , src );
14721477 src = (jl_value_t * )((char * )src + nptr * sizeof (void * ));
1478+ dst += nptr * sizeof (void * );
14731479 nb -= nptr * sizeof (void * );
14741480 }
14751481 else {
0 commit comments