@@ -188,10 +188,19 @@ JL_DLLEXPORT jl_array_t *jl_reshape_array(jl_value_t *atype, jl_array_t *data,
188188 a -> offset = 0 ;
189189 a -> data = NULL ;
190190 a -> flags .isaligned = data -> flags .isaligned ;
191+ jl_array_t * owner = (jl_array_t * )jl_array_owner (data );
191192 jl_value_t * el_type = jl_tparam0 (atype );
192193 assert (store_unboxed (el_type ) == !data -> flags .ptrarray );
193194 if (!data -> flags .ptrarray ) {
194195 a -> elsize = jl_datatype_size (el_type );
196+ unsigned align = ((jl_datatype_t * )el_type )-> layout -> alignment ;
197+ jl_value_t * ownerty = jl_typeof (owner );
198+ unsigned oldalign = (ownerty == (jl_value_t * )jl_string_type ? 1 :
199+ ((jl_datatype_t * )jl_tparam0 (ownerty ))-> layout -> alignment );
200+ if (oldalign < align )
201+ jl_exceptionf (jl_argumenterror_type ,
202+ "reinterpret from alignment %u to alignment %u not allowed" ,
203+ oldalign , align );
195204 a -> flags .ptrarray = 0 ;
196205 }
197206 else {
@@ -201,7 +210,7 @@ JL_DLLEXPORT jl_array_t *jl_reshape_array(jl_value_t *atype, jl_array_t *data,
201210
202211 // if data is itself a shared wrapper,
203212 // owner should point back to the original array
204- jl_array_data_owner (a ) = jl_array_owner ( data ) ;
213+ jl_array_data_owner (a ) = ( jl_value_t * ) owner ;
205214
206215 a -> flags .how = 3 ;
207216 a -> data = data -> data ;
@@ -266,15 +275,22 @@ JL_DLLEXPORT jl_array_t *jl_ptr_to_array_1d(jl_value_t *atype, void *data,
266275 size_t nel , int own_buffer )
267276{
268277 jl_ptls_t ptls = jl_get_ptls_states ();
269- size_t elsz ;
270278 jl_array_t * a ;
271279 jl_value_t * el_type = jl_tparam0 (atype );
272280
273281 int isunboxed = store_unboxed (el_type );
274- if (isunboxed )
282+ size_t elsz ;
283+ unsigned align ;
284+ if (isunboxed ) {
275285 elsz = jl_datatype_size (el_type );
276- else
277- elsz = sizeof (void * );
286+ align = ((jl_datatype_t * )el_type )-> layout -> alignment ;
287+ }
288+ else {
289+ align = elsz = sizeof (void * );
290+ }
291+ if (((uintptr_t )data ) & (align - 1 ))
292+ jl_exceptionf (jl_argumenterror_type ,
293+ "unsafe_wrap: pointer %p is not properly aligned to %u" , data , align );
278294
279295 int ndimwords = jl_array_ndimwords (1 );
280296 int tsz = JL_ARRAY_ALIGN (sizeof (jl_array_t ) + ndimwords * sizeof (size_t ), JL_CACHE_BYTE_ALIGNMENT );
@@ -309,7 +325,7 @@ JL_DLLEXPORT jl_array_t *jl_ptr_to_array(jl_value_t *atype, void *data,
309325 jl_value_t * _dims , int own_buffer )
310326{
311327 jl_ptls_t ptls = jl_get_ptls_states ();
312- size_t elsz , nel = 1 ;
328+ size_t nel = 1 ;
313329 jl_array_t * a ;
314330 size_t ndims = jl_nfields (_dims );
315331 wideint_t prod ;
@@ -326,10 +342,18 @@ JL_DLLEXPORT jl_array_t *jl_ptr_to_array(jl_value_t *atype, void *data,
326342 jl_value_t * el_type = jl_tparam0 (atype );
327343
328344 int isunboxed = store_unboxed (el_type );
329- if (isunboxed )
345+ size_t elsz ;
346+ unsigned align ;
347+ if (isunboxed ) {
330348 elsz = jl_datatype_size (el_type );
331- else
332- elsz = sizeof (void * );
349+ align = ((jl_datatype_t * )el_type )-> layout -> alignment ;
350+ }
351+ else {
352+ align = elsz = sizeof (void * );
353+ }
354+ if (((uintptr_t )data ) & (align - 1 ))
355+ jl_exceptionf (jl_argumenterror_type ,
356+ "unsafe_wrap: pointer %p is not properly aligned to %u" , data , align );
333357
334358 int ndimwords = jl_array_ndimwords (ndims );
335359 int tsz = JL_ARRAY_ALIGN (sizeof (jl_array_t ) + ndimwords * sizeof (size_t ), JL_CACHE_BYTE_ALIGNMENT );
0 commit comments