diff --git a/Lib/test/test_index.py b/Lib/test/test_index.py index 69aae298f..a215b1c83 100644 --- a/Lib/test/test_index.py +++ b/Lib/test/test_index.py @@ -22,8 +22,6 @@ class BaseTestCase(unittest.TestCase): self.assertEqual(operator.index(self.o), -2) self.assertEqual(operator.index(self.n), 2) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_slice(self): self.o.ind = 1 self.n.ind = 2 diff --git a/Lib/test/test_slice.py b/Lib/test/test_slice.py index 5a9116365..ecdd92b6c 100644 --- a/Lib/test/test_slice.py +++ b/Lib/test/test_slice.py @@ -155,8 +155,6 @@ class SliceTest(unittest.TestCase): expected = range(length)[slice] self.assertEqual(actual, expected) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_indices(self): self.assertEqual(slice(None ).indices(10), (0, 10, 1)) self.assertEqual(slice(None, None, 2).indices(10), (0, 10, 2)) diff --git a/vm/src/builtins/slice.rs b/vm/src/builtins/slice.rs index 59f293ad4..0f09b4a92 100644 --- a/vm/src/builtins/slice.rs +++ b/vm/src/builtins/slice.rs @@ -1,6 +1,6 @@ // sliceobject.{h,c} in CPython -use super::int::PyInt; +use super::int::{PyInt, PyIntRef}; use super::pytype::PyTypeRef; use crate::function::{FuncArgs, OptionalArg}; use crate::pyobject::{ @@ -205,16 +205,17 @@ impl PySlice { } #[pymethod(name = "indices")] - fn indices(&self, length: PyObjectRef, vm: &VirtualMachine) -> PyResult { - if let Some(length) = length.payload::() { - let (start, stop, step) = self.inner_indices(length.borrow_value(), vm)?; + fn indices(&self, length: PyIntRef, vm: &VirtualMachine) -> PyResult { + let length = length.borrow_value(); + if length.is_negative() { + Err(vm.new_value_error("length should not be negative.".to_owned())) + } else { + let (start, stop, step) = self.inner_indices(length, vm)?; Ok(vm.ctx.new_tuple(vec![ vm.ctx.new_int(start), vm.ctx.new_int(stop), vm.ctx.new_int(step), ])) - } else { - Ok(vm.ctx.not_implemented()) } } }