@@ -48,7 +48,7 @@ size_t jl_arr_xtralloc_limit = 0;
48
48
#define MAXINTVAL (((size_t)-1)>>1)
49
49
50
50
static jl_array_t * _new_array_ (jl_value_t * atype , uint32_t ndims , size_t * dims ,
51
- int isunboxed , int elsz )
51
+ int isunboxed , int elsz , int elalign )
52
52
{
53
53
jl_ptls_t ptls = jl_get_ptls_states ();
54
54
size_t i , tot , nel = 1 ;
@@ -87,11 +87,11 @@ static jl_array_t *_new_array_(jl_value_t *atype, uint32_t ndims, size_t *dims,
87
87
int tsz = JL_ARRAY_ALIGN (sizeof (jl_array_t ) + ndimwords * sizeof (size_t ), JL_CACHE_BYTE_ALIGNMENT );
88
88
if (tot <= ARRAY_INLINE_NBYTES ) {
89
89
if (isunboxed && elsz >= 4 )
90
- tsz = JL_ARRAY_ALIGN (tsz , JL_SMALL_BYTE_ALIGNMENT ); // align data area
90
+ tsz = JL_ARRAY_ALIGN (tsz , elalign ); // align data area
91
91
size_t doffs = tsz ;
92
92
tsz += tot ;
93
93
tsz = JL_ARRAY_ALIGN (tsz , JL_SMALL_BYTE_ALIGNMENT ); // align whole object
94
- a = (jl_array_t * )jl_gc_alloc (ptls , tsz , JL_SMALL_BYTE_ALIGNMENT , atype );
94
+ a = (jl_array_t * )jl_gc_alloc (ptls , tsz , elalign , atype );
95
95
// No allocation or safepoint allowed after this
96
96
a -> flags .how = 0 ;
97
97
data = (char * )a + doffs ;
@@ -147,14 +147,13 @@ static inline jl_array_t *_new_array(jl_value_t *atype, uint32_t ndims, size_t *
147
147
elsz = sizeof (void * );
148
148
al = elsz ;
149
149
}
150
-
151
- return _new_array_ (atype , ndims , dims , isunboxed , elsz );
150
+ return _new_array_ (atype , ndims , dims , isunboxed , elsz , al );
152
151
}
153
152
154
153
jl_array_t * jl_new_array_for_deserialization (jl_value_t * atype , uint32_t ndims , size_t * dims ,
155
- int isunboxed , int elsz )
154
+ int isunboxed , int elsz , int elalign )
156
155
{
157
- return _new_array_ (atype , ndims , dims , isunboxed , elsz );
156
+ return _new_array_ (atype , ndims , dims , isunboxed , elsz , elalign );
158
157
}
159
158
160
159
#ifndef JL_NDEBUG
@@ -305,7 +304,7 @@ JL_DLLEXPORT jl_array_t *jl_ptr_to_array_1d(jl_value_t *atype, void *data,
305
304
306
305
int ndimwords = jl_array_ndimwords (1 );
307
306
int tsz = JL_ARRAY_ALIGN (sizeof (jl_array_t ) + ndimwords * sizeof (size_t ), JL_CACHE_BYTE_ALIGNMENT );
308
- a = (jl_array_t * )jl_gc_alloc (ptls , tsz , JL_CACHE_BYTE_ALIGNMENT , atype );
307
+ a = (jl_array_t * )jl_gc_alloc (ptls , tsz , align , atype );
309
308
// No allocation or safepoint allowed after this
310
309
a -> flags .pooled = tsz <= GC_MAX_SZCLASS ;
311
310
a -> data = data ;
@@ -371,7 +370,7 @@ JL_DLLEXPORT jl_array_t *jl_ptr_to_array(jl_value_t *atype, void *data,
371
370
372
371
int ndimwords = jl_array_ndimwords (ndims );
373
372
int tsz = JL_ARRAY_ALIGN (sizeof (jl_array_t ) + ndimwords * sizeof (size_t ), JL_CACHE_BYTE_ALIGNMENT );
374
- a = (jl_array_t * )jl_gc_alloc (ptls , tsz , JL_CACHE_BYTE_ALIGNMENT , atype );
373
+ a = (jl_array_t * )jl_gc_alloc (ptls , tsz , align , atype );
375
374
// No allocation or safepoint allowed after this
376
375
a -> flags .pooled = tsz <= GC_MAX_SZCLASS ;
377
376
a -> data = data ;
@@ -1042,9 +1041,10 @@ JL_DLLEXPORT void jl_array_sizehint(jl_array_t *a, size_t sz)
1042
1041
JL_DLLEXPORT jl_array_t * jl_array_copy (jl_array_t * ary )
1043
1042
{
1044
1043
size_t elsz = ary -> elsize ;
1044
+ size_t elalign = ary -> flags .ptrarray ? sizeof (void * ) : jl_datatype_align (jl_tparam0 (jl_typeof (ary )));
1045
1045
size_t len = jl_array_len (ary );
1046
1046
jl_array_t * new_ary = _new_array_ (jl_typeof (ary ), jl_array_ndims (ary ),
1047
- & ary -> nrows , !ary -> flags .ptrarray , elsz );
1047
+ & ary -> nrows , !ary -> flags .ptrarray , elsz , elalign );
1048
1048
memcpy (new_ary -> data , ary -> data , len * elsz );
1049
1049
// ensure isbits union arrays copy their selector bytes correctly
1050
1050
if (!ary -> flags .ptrarray && jl_is_uniontype (jl_tparam0 (jl_typeof (ary )))) {
0 commit comments