(obj: &PyObject, mut f: F, vm: &VirtualMachine)
| 424 | } |
| 425 | |
| 426 | fn extract_cloned<F, R>(obj: &PyObject, mut f: F, vm: &VirtualMachine) -> PyResult<Vec<R>> |
| 427 | where |
| 428 | F: FnMut(PyObjectRef) -> PyResult<R>, |
| 429 | { |
| 430 | use crate::builtins::PyTuple; |
| 431 | if let Some(tuple) = obj.downcast_ref_if_exact::<PyTuple>(vm) { |
| 432 | tuple.iter().map(|x| f(x.clone())).collect() |
| 433 | } else if let Some(list) = obj.downcast_ref_if_exact::<PyList>(vm) { |
| 434 | list.borrow_vec().iter().map(|x| f(x.clone())).collect() |
| 435 | } else { |
| 436 | let iter = obj.to_owned().get_iter(vm)?; |
| 437 | let iter = iter.iter::<PyObjectRef>(vm)?; |
| 438 | let len = obj |
| 439 | .sequence_unchecked() |
| 440 | .length_opt(vm) |
| 441 | .transpose()? |
| 442 | .unwrap_or(0); |
| 443 | let mut v = Vec::with_capacity(len); |
| 444 | for x in iter { |
| 445 | v.push(f(x?)?); |
| 446 | } |
| 447 | v.shrink_to_fit(); |
| 448 | Ok(v) |
| 449 | } |
| 450 | } |
| 451 | |
| 452 | impl MutObjectSequenceOp for PyList { |
| 453 | type Inner = [PyObjectRef]; |
no test coverage detected