@@ -5,6 +5,7 @@ use crate::npyffi::{
55 * ,
66} ;
77use crate :: types:: Element ;
8+ use crate :: error:: NpyIterInstantiationError ;
89use pyo3:: { prelude:: * , PyNativeType } ;
910
1011use std:: marker:: PhantomData ;
@@ -100,7 +101,7 @@ impl<'py, T: Element> NpySingleIterBuilder<'py, T> {
100101 )
101102 } ;
102103 let py = self . array . py ( ) ;
103- NpySingleIter :: new ( iter_ptr, py) . ok_or_else ( || PyErr :: fetch ( py ) )
104+ NpySingleIter :: new ( iter_ptr, py)
104105 }
105106}
106107
@@ -114,19 +115,29 @@ pub struct NpySingleIter<'py, T> {
114115}
115116
116117impl < ' py , T > NpySingleIter < ' py , T > {
117- fn new ( iterator : * mut objects:: NpyIter , py : Python < ' py > ) -> Option < NpySingleIter < ' py , T > > {
118- let mut iterator = ptr:: NonNull :: new ( iterator) ?;
118+ fn new ( iterator : * mut objects:: NpyIter , py : Python < ' py > ) -> PyResult < NpySingleIter < ' py , T > > {
119+ let mut iterator = match ptr:: NonNull :: new ( iterator) {
120+ Some ( iter) => iter,
121+ None => {
122+ return Err ( NpyIterInstantiationError . into ( ) ) ;
123+ }
124+ } ;
119125
120126 // TODO replace the null second arg with something correct.
121- let iternext =
122- unsafe { PY_ARRAY_API . NpyIter_GetIterNext ( iterator. as_mut ( ) , ptr:: null_mut ( ) ) ? } ;
127+ let iternext = match unsafe { PY_ARRAY_API . NpyIter_GetIterNext ( iterator. as_mut ( ) , ptr:: null_mut ( ) ) } {
128+ Some ( ptr) => ptr,
129+ None => {
130+ return Err ( PyErr :: fetch ( py) ) ;
131+ }
132+ } ;
123133 let dataptr = unsafe { PY_ARRAY_API . NpyIter_GetDataPtrArray ( iterator. as_mut ( ) ) } ;
124134
125135 if dataptr. is_null ( ) {
126136 unsafe { PY_ARRAY_API . NpyIter_Deallocate ( iterator. as_mut ( ) ) } ;
137+ return Err ( NpyIterInstantiationError . into ( ) ) ;
127138 }
128139
129- Some ( NpySingleIter {
140+ Ok ( NpySingleIter {
130141 iterator,
131142 iternext,
132143 empty : false , // TODO: Handle empty iterators
0 commit comments