@@ -5,6 +5,7 @@ use crate::npyffi::{
5
5
* ,
6
6
} ;
7
7
use crate :: types:: Element ;
8
+ use crate :: error:: NpyIterInstantiationError ;
8
9
use pyo3:: { prelude:: * , PyNativeType } ;
9
10
10
11
use std:: marker:: PhantomData ;
@@ -100,7 +101,7 @@ impl<'py, T: Element> NpySingleIterBuilder<'py, T> {
100
101
)
101
102
} ;
102
103
let py = self . array . py ( ) ;
103
- NpySingleIter :: new ( iter_ptr, py) . ok_or_else ( || PyErr :: fetch ( py ) )
104
+ NpySingleIter :: new ( iter_ptr, py)
104
105
}
105
106
}
106
107
@@ -114,19 +115,29 @@ pub struct NpySingleIter<'py, T> {
114
115
}
115
116
116
117
impl < ' 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
+ } ;
119
125
120
126
// 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
+ } ;
123
133
let dataptr = unsafe { PY_ARRAY_API . NpyIter_GetDataPtrArray ( iterator. as_mut ( ) ) } ;
124
134
125
135
if dataptr. is_null ( ) {
126
136
unsafe { PY_ARRAY_API . NpyIter_Deallocate ( iterator. as_mut ( ) ) } ;
137
+ return Err ( NpyIterInstantiationError . into ( ) ) ;
127
138
}
128
139
129
- Some ( NpySingleIter {
140
+ Ok ( NpySingleIter {
130
141
iterator,
131
142
iternext,
132
143
empty : false , // TODO: Handle empty iterators
0 commit comments