@@ -832,38 +832,48 @@ impl<T: Element, D: Dimension> PyArray<T, D> {
832
832
where
833
833
F : FnOnce ( StrideShape < D > , * mut T ) -> ArrayBase < S , D > ,
834
834
{
835
- let shape = D :: from_dimension ( & Dim ( self . shape ( ) ) ) . expect ( "mismatching dimensions" ) ;
836
-
837
- let strides = self . strides ( ) ;
838
- let itemsize = mem:: size_of :: < T > ( ) ;
839
-
840
- assert ! (
841
- strides. len( ) <= 32 ,
842
- "Only dimensionalities of up to 32 are supported"
843
- ) ;
844
-
845
- let mut new_strides = D :: zeros ( strides. len ( ) ) ;
846
- let mut data_ptr = self . data ( ) ;
847
- let mut inverted_axes = 0_u32 ;
848
-
849
- for i in 0 ..strides. len ( ) {
850
- // FIXME(kngwyu): Replace this hacky negative strides support with
851
- // a proper constructor, when it's implemented.
852
- // See https://github.com/rust-ndarray/ndarray/issues/842 for more.
853
- if strides[ i] >= 0 {
854
- new_strides[ i] = strides[ i] as usize / itemsize;
855
- } else {
856
- // Move the pointer to the start position.
857
- let offset = strides[ i] * ( shape[ i] as isize - 1 ) / itemsize as isize ;
858
- data_ptr = unsafe { data_ptr. offset ( offset) } ;
859
-
860
- new_strides[ i] = ( -strides[ i] ) as usize / itemsize;
835
+ fn inner < D : Dimension > (
836
+ shape : & [ usize ] ,
837
+ strides : & [ isize ] ,
838
+ itemsize : usize ,
839
+ mut data_ptr : * mut u8 ,
840
+ ) -> ( StrideShape < D > , u32 , * mut u8 ) {
841
+ let shape = D :: from_dimension ( & Dim ( shape) ) . expect ( "mismatching dimensions" ) ;
842
+
843
+ assert ! (
844
+ strides. len( ) <= 32 ,
845
+ "Only dimensionalities of up to 32 are supported"
846
+ ) ;
861
847
862
- inverted_axes |= 1 << i;
848
+ let mut new_strides = D :: zeros ( strides. len ( ) ) ;
849
+ let mut inverted_axes = 0_u32 ;
850
+
851
+ for i in 0 ..strides. len ( ) {
852
+ // FIXME(kngwyu): Replace this hacky negative strides support with
853
+ // a proper constructor, when it's implemented.
854
+ // See https://github.com/rust-ndarray/ndarray/issues/842 for more.
855
+ if strides[ i] >= 0 {
856
+ new_strides[ i] = strides[ i] as usize / itemsize;
857
+ } else {
858
+ // Move the pointer to the start position.
859
+ data_ptr = unsafe { data_ptr. offset ( strides[ i] * ( shape[ i] as isize - 1 ) ) } ;
860
+
861
+ new_strides[ i] = ( -strides[ i] ) as usize / itemsize;
862
+ inverted_axes |= 1 << i;
863
+ }
863
864
}
865
+
866
+ ( shape. strides ( new_strides) , inverted_axes, data_ptr)
864
867
}
865
868
866
- let mut array = from_shape_ptr ( shape. strides ( new_strides) , data_ptr) ;
869
+ let ( shape, mut inverted_axes, data_ptr) = inner (
870
+ self . shape ( ) ,
871
+ self . strides ( ) ,
872
+ mem:: size_of :: < T > ( ) ,
873
+ self . data ( ) as _ ,
874
+ ) ;
875
+
876
+ let mut array = from_shape_ptr ( shape, data_ptr as _ ) ;
867
877
868
878
while inverted_axes != 0 {
869
879
let axis = inverted_axes. trailing_zeros ( ) as usize ;
0 commit comments