Skip to content

Commit 3ce476c

Browse files
committed
Add optional arguments to tuple.index()
More or less directly translated from the CPython implementation.
1 parent d32e550 commit 3ce476c

1 file changed

Lines changed: 28 additions & 2 deletions

File tree

vm/src/builtins/tuple.rs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,34 @@ impl PyTuple {
181181
}
182182

183183
#[pymethod(name = "index")]
184-
fn index(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<usize> {
185-
for (index, element) in self.elements.iter().enumerate() {
184+
fn index(
185+
&self,
186+
needle: PyObjectRef,
187+
start: OptionalArg<isize>,
188+
stop: OptionalArg<isize>,
189+
vm: &VirtualMachine,
190+
) -> PyResult<usize> {
191+
let mut start = start.into_option().unwrap_or(0);
192+
if start < 0 {
193+
start += self.borrow_value().len() as isize;
194+
if start < 0 {
195+
start = 0;
196+
}
197+
}
198+
let mut stop = stop.into_option().unwrap_or(isize::MAX);
199+
if stop < 0 {
200+
stop += self.borrow_value().len() as isize;
201+
if stop < 0 {
202+
stop = 0;
203+
}
204+
}
205+
for (index, element) in self
206+
.elements
207+
.iter()
208+
.enumerate()
209+
.take(stop as usize)
210+
.skip(start as usize)
211+
{
186212
if vm.identical_or_equal(element, &needle)? {
187213
return Ok(index);
188214
}

0 commit comments

Comments
 (0)