File tree Expand file tree Collapse file tree 2 files changed +12
-4
lines changed Expand file tree Collapse file tree 2 files changed +12
-4
lines changed Original file line number Diff line number Diff line change @@ -1761,8 +1761,6 @@ def test_tee_del_backward(self):
1761
1761
del forward , backward
1762
1762
raise
1763
1763
1764
- # TODO: RUSTPYTHON
1765
- @unittest .expectedFailure
1766
1764
def test_tee_reenter (self ):
1767
1765
class I :
1768
1766
first = True
Original file line number Diff line number Diff line change @@ -1185,21 +1185,31 @@ mod decl {
1185
1185
struct PyItertoolsTeeData {
1186
1186
iterable : PyIter ,
1187
1187
values : PyRwLock < Vec < PyObjectRef > > ,
1188
+ locked : AtomicCell < bool > ,
1188
1189
}
1189
1190
1190
1191
impl PyItertoolsTeeData {
1191
1192
fn new ( iterable : PyIter , _vm : & VirtualMachine ) -> PyResult < PyRc < Self > > {
1192
1193
Ok ( PyRc :: new ( Self {
1193
1194
iterable,
1194
1195
values : PyRwLock :: new ( vec ! [ ] ) ,
1196
+ locked : AtomicCell :: new ( false ) ,
1195
1197
} ) )
1196
1198
}
1197
1199
1198
1200
fn get_item ( & self , vm : & VirtualMachine , index : usize ) -> PyResult < PyIterReturn > {
1199
1201
if self . values . read ( ) . len ( ) == index {
1200
- let result = raise_if_stop ! ( self . iterable. next( vm) ?) ;
1201
- self . values . write ( ) . push ( result) ;
1202
+ if self . locked . swap ( true ) {
1203
+ return Err ( vm. new_runtime_error ( "cannot re-enter the tee iterator" ) ) ;
1204
+ }
1205
+
1206
+ let result = self . iterable . next ( vm) ;
1207
+ self . locked . store ( false ) ;
1208
+
1209
+ let obj = raise_if_stop ! ( result?) ;
1210
+ self . values . write ( ) . push ( obj) ;
1202
1211
}
1212
+
1203
1213
Ok ( PyIterReturn :: Return ( self . values . read ( ) [ index] . clone ( ) ) )
1204
1214
}
1205
1215
}
You can’t perform that action at this time.
0 commit comments