(&self, vm: &VirtualMachine, index: usize)
| 965 | } |
| 966 | |
| 967 | fn get_item(&self, vm: &VirtualMachine, index: usize) -> PyResult<PyIterReturn> { |
| 968 | // Return cached value if available |
| 969 | { |
| 970 | let Some(values) = self.values.try_lock() else { |
| 971 | return Err(vm.new_runtime_error("cannot re-enter the tee iterator")); |
| 972 | }; |
| 973 | if index < values.len() { |
| 974 | return Ok(PyIterReturn::Return(values[index].clone())); |
| 975 | } |
| 976 | } |
| 977 | // Prevent concurrent/reentrant calls to iterable.next() |
| 978 | if self.running.swap(true, Ordering::Acquire) { |
| 979 | return Err(vm.new_runtime_error("cannot re-enter the tee iterator")); |
| 980 | } |
| 981 | let result = self.iterable.next(vm); |
| 982 | self.running.store(false, Ordering::Release); |
| 983 | let obj = raise_if_stop!(result?); |
| 984 | let Some(mut values) = self.values.try_lock() else { |
| 985 | return Err(vm.new_runtime_error("cannot re-enter the tee iterator")); |
| 986 | }; |
| 987 | if values.len() == index { |
| 988 | values.push(obj); |
| 989 | } |
| 990 | Ok(PyIterReturn::Return(values[index].clone())) |
| 991 | } |
| 992 | } |
| 993 | |
| 994 | #[pyattr] |
no test coverage detected