diff --git a/src/datatype.c b/src/datatype.c index 593a2ededd169..1d9178d69dfca 100644 --- a/src/datatype.c +++ b/src/datatype.c @@ -282,7 +282,7 @@ static unsigned union_isinlinable(jl_value_t *ty, int pointerfree, size_t *nbyte size_t sz = jl_datatype_size(ty); size_t al = jl_datatype_align(ty); // primitive types in struct slots need their sizes aligned. issue #37974 - if (asfield && jl_is_primitivetype(ty)) + if (asfield) sz = LLT_ALIGN(sz, al); if (*nbytes < sz) *nbytes = sz; @@ -525,9 +525,7 @@ void jl_compute_field_offsets(jl_datatype_t *st) if (al > alignm) alignm = al; } - st->size = LLT_ALIGN(sz, alignm); - if (st->size > sz) - haspadding = 1; + st->size = sz; if (should_malloc && npointers) pointers = (uint32_t*)malloc_s(npointers * sizeof(uint32_t)); else @@ -1470,6 +1468,7 @@ static inline void memassign_safe(int hasptr, jl_value_t *parent, char *dst, con memmove_refs((void**)dst, (void**)src, nptr); jl_gc_multi_wb(parent, src); src = (jl_value_t*)((char*)src + nptr * sizeof(void*)); + dst += nptr * sizeof(void*); nb -= nptr * sizeof(void*); } else {