@@ -15,7 +15,9 @@ use rustc_hash::FxHashMap;
1515use crate :: array:: get_array_module;
1616use crate :: cold;
1717use crate :: error:: BorrowError ;
18- use crate :: npyffi:: { PyArrayObject , PyArray_Check , PyDataType_ELSIZE , NPY_ARRAY_WRITEABLE } ;
18+ use crate :: npyffi:: {
19+ _PyArray_GET_ITEM_DATA, PyArrayObject , PyArray_Check , PyDataType_ELSIZE , NPY_ARRAY_WRITEABLE ,
20+ } ;
1921
2022/// Defines the shared C API used for borrow checking
2123///
@@ -57,7 +59,7 @@ unsafe extern "C" fn acquire_shared(flags: *mut c_void, array: *mut PyArrayObjec
5759}
5860
5961unsafe extern "C" fn acquire_mut_shared ( flags : * mut c_void , array : * mut PyArrayObject ) -> c_int {
60- if ( * array) . flags & NPY_ARRAY_WRITEABLE == 0 {
62+ if ( * _PyArray_GET_ITEM_DATA ( array) ) . flags & NPY_ARRAY_WRITEABLE == 0 {
6163 return -2 ;
6264 }
6365
@@ -368,7 +370,7 @@ impl BorrowFlags {
368370
369371fn base_address < ' py > ( py : Python < ' py > , mut array : * mut PyArrayObject ) -> * mut c_void {
370372 loop {
371- let base = unsafe { ( * array) . base } ;
373+ let base = unsafe { ( * _PyArray_GET_ITEM_DATA ( array) ) . base } ;
372374
373375 if base. is_null ( ) {
374376 return array as * mut c_void ;
@@ -383,7 +385,7 @@ fn base_address<'py>(py: Python<'py>, mut array: *mut PyArrayObject) -> *mut c_v
383385fn borrow_key < ' py > ( py : Python < ' py > , array : * mut PyArrayObject ) -> BorrowKey {
384386 let range = data_range ( py, array) ;
385387
386- let data_ptr = unsafe { ( * array) . data } ;
388+ let data_ptr = unsafe { ( * _PyArray_GET_ITEM_DATA ( array) ) . data } ;
387389 let gcd_strides = gcd_strides ( array) ;
388390
389391 BorrowKey {
@@ -394,6 +396,7 @@ fn borrow_key<'py>(py: Python<'py>, array: *mut PyArrayObject) -> BorrowKey {
394396}
395397
396398fn data_range < ' py > ( py : Python < ' py > , array : * mut PyArrayObject ) -> ( * mut c_char , * mut c_char ) {
399+ let array = unsafe { _PyArray_GET_ITEM_DATA ( array) } ;
397400 let nd = unsafe { ( * array) . nd } as usize ;
398401 let data = unsafe { ( * array) . data } ;
399402
@@ -430,6 +433,7 @@ fn data_range<'py>(py: Python<'py>, array: *mut PyArrayObject) -> (*mut c_char,
430433}
431434
432435fn gcd_strides ( array : * mut PyArrayObject ) -> isize {
436+ let array = unsafe { _PyArray_GET_ITEM_DATA ( array) } ;
433437 let nd = unsafe { ( * array) . nd } as usize ;
434438
435439 if nd == 0 {
@@ -492,7 +496,7 @@ mod tests {
492496 Python :: attach ( |py| {
493497 let array = PyArray :: < f64 , _ > :: zeros ( py, ( 1 , 2 , 3 ) , false ) ;
494498
495- let base = unsafe { ( * array. as_array_ptr ( ) ) . base } ;
499+ let base = unsafe { ( * _PyArray_GET_ITEM_DATA ( array. as_array_ptr ( ) . cast_const ( ) ) ) . base } ;
496500 assert ! ( base. is_null( ) ) ;
497501
498502 let base_address = base_address ( py, array. as_array_ptr ( ) ) ;
@@ -509,7 +513,7 @@ mod tests {
509513 Python :: attach ( |py| {
510514 let array = Array :: < f64 , _ > :: zeros ( ( 1 , 2 , 3 ) ) . into_pyarray ( py) ;
511515
512- let base = unsafe { ( * array. as_array_ptr ( ) ) . base } ;
516+ let base = unsafe { ( * _PyArray_GET_ITEM_DATA ( array. as_array_ptr ( ) . cast_const ( ) ) ) . base } ;
513517 assert ! ( !base. is_null( ) ) ;
514518
515519 let base_address = base_address ( py, array. as_array_ptr ( ) ) ;
@@ -540,7 +544,7 @@ mod tests {
540544 array. as_ptr( ) . cast:: <c_void>( )
541545 ) ;
542546
543- let base = unsafe { ( * view. as_array_ptr ( ) ) . base } ;
547+ let base = unsafe { ( * _PyArray_GET_ITEM_DATA ( view. as_array_ptr ( ) . cast_const ( ) ) ) . base } ;
544548 assert_eq ! ( base as * mut c_void, array. as_ptr( ) . cast:: <c_void>( ) ) ;
545549
546550 let base_address = base_address ( py, view. as_array_ptr ( ) ) ;
@@ -569,10 +573,10 @@ mod tests {
569573 array. as_ptr( ) . cast:: <c_void>( ) ,
570574 ) ;
571575
572- let base = unsafe { ( * view. as_array_ptr ( ) ) . base } ;
576+ let base = unsafe { ( * _PyArray_GET_ITEM_DATA ( view. as_array_ptr ( ) . cast_const ( ) ) ) . base } ;
573577 assert_eq ! ( base. cast:: <c_void>( ) , array. as_ptr( ) . cast:: <c_void>( ) ) ;
574578
575- let base = unsafe { ( * array. as_array_ptr ( ) ) . base } ;
579+ let base = unsafe { ( * _PyArray_GET_ITEM_DATA ( array. as_array_ptr ( ) . cast_const ( ) ) ) . base } ;
576580 assert ! ( !base. is_null( ) ) ;
577581
578582 let base_address = base_address ( py, view. as_array_ptr ( ) ) ;
@@ -619,10 +623,10 @@ mod tests {
619623 view1. as_ptr( ) . cast:: <c_void>( )
620624 ) ;
621625
622- let base = unsafe { ( * view2. as_array_ptr ( ) ) . base } ;
626+ let base = unsafe { ( * _PyArray_GET_ITEM_DATA ( view2. as_array_ptr ( ) . cast_const ( ) ) ) . base } ;
623627 assert_eq ! ( base as * mut c_void, array. as_ptr( ) . cast:: <c_void>( ) ) ;
624628
625- let base = unsafe { ( * view1. as_array_ptr ( ) ) . base } ;
629+ let base = unsafe { ( * _PyArray_GET_ITEM_DATA ( view1. as_array_ptr ( ) . cast_const ( ) ) ) . base } ;
626630 assert_eq ! ( base as * mut c_void, array. as_ptr( ) . cast:: <c_void>( ) ) ;
627631
628632 let base_address = base_address ( py, view2. as_array_ptr ( ) ) ;
@@ -667,13 +671,13 @@ mod tests {
667671 view1. as_ptr( ) . cast:: <c_void>( ) ,
668672 ) ;
669673
670- let base = unsafe { ( * view2. as_array_ptr ( ) ) . base } ;
674+ let base = unsafe { ( * _PyArray_GET_ITEM_DATA ( view2. as_array_ptr ( ) . cast_const ( ) ) ) . base } ;
671675 assert_eq ! ( base. cast:: <c_void>( ) , array. as_ptr( ) . cast:: <c_void>( ) ) ;
672676
673- let base = unsafe { ( * view1. as_array_ptr ( ) ) . base } ;
677+ let base = unsafe { ( * _PyArray_GET_ITEM_DATA ( view1. as_array_ptr ( ) . cast_const ( ) ) ) . base } ;
674678 assert_eq ! ( base. cast:: <c_void>( ) , array. as_ptr( ) . cast:: <c_void>( ) ) ;
675679
676- let base = unsafe { ( * array. as_array_ptr ( ) ) . base } ;
680+ let base = unsafe { ( * _PyArray_GET_ITEM_DATA ( array. as_array_ptr ( ) . cast_const ( ) ) ) . base } ;
677681 assert ! ( !base. is_null( ) ) ;
678682
679683 let base_address = base_address ( py, view2. as_array_ptr ( ) ) ;
@@ -706,7 +710,7 @@ mod tests {
706710 array. as_ptr( ) . cast:: <c_void>( )
707711 ) ;
708712
709- let base = unsafe { ( * view. as_array_ptr ( ) ) . base } ;
713+ let base = unsafe { ( * _PyArray_GET_ITEM_DATA ( view. as_array_ptr ( ) . cast_const ( ) ) ) . base } ;
710714 assert_eq ! ( base. cast:: <c_void>( ) , array. as_ptr( ) . cast:: <c_void>( ) ) ;
711715
712716 let base_address = base_address ( py, view. as_array_ptr ( ) ) ;
@@ -727,7 +731,7 @@ mod tests {
727731 Python :: attach ( |py| {
728732 let array = PyArray :: < f64 , _ > :: zeros ( py, ( 1 , 0 , 3 ) , false ) ;
729733
730- let base = unsafe { ( * array. as_array_ptr ( ) ) . base } ;
734+ let base = unsafe { ( * _PyArray_GET_ITEM_DATA ( array. as_array_ptr ( ) . cast_const ( ) ) ) . base } ;
731735 assert ! ( base. is_null( ) ) ;
732736
733737 let base_address = base_address ( py, array. as_array_ptr ( ) ) ;
0 commit comments