From 3ce476c13d4daa3366e012a96a5e52e271ed2b29 Mon Sep 17 00:00:00 2001 From: Padraic Fanning Date: Thu, 25 Feb 2021 16:12:44 -0500 Subject: [PATCH] Add optional arguments to tuple.index() More or less directly translated from the CPython implementation. --- vm/src/builtins/tuple.rs | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/vm/src/builtins/tuple.rs b/vm/src/builtins/tuple.rs index 4bcb73449..611c37628 100644 --- a/vm/src/builtins/tuple.rs +++ b/vm/src/builtins/tuple.rs @@ -181,8 +181,34 @@ impl PyTuple { } #[pymethod(name = "index")] - fn index(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult { - for (index, element) in self.elements.iter().enumerate() { + fn index( + &self, + needle: PyObjectRef, + start: OptionalArg, + stop: OptionalArg, + vm: &VirtualMachine, + ) -> PyResult { + let mut start = start.into_option().unwrap_or(0); + if start < 0 { + start += self.borrow_value().len() as isize; + if start < 0 { + start = 0; + } + } + let mut stop = stop.into_option().unwrap_or(isize::MAX); + if stop < 0 { + stop += self.borrow_value().len() as isize; + if stop < 0 { + stop = 0; + } + } + for (index, element) in self + .elements + .iter() + .enumerate() + .take(stop as usize) + .skip(start as usize) + { if vm.identical_or_equal(element, &needle)? { return Ok(index); }