diff --git a/vm/src/builtins/bytearray.rs b/vm/src/builtins/bytearray.rs index 77c664946..2447c3f43 100644 --- a/vm/src/builtins/bytearray.rs +++ b/vm/src/builtins/bytearray.rs @@ -742,16 +742,14 @@ impl PyValue for PyByteArrayIterator { #[pyimpl(with(SlotIterator))] impl PyByteArrayIterator { #[pymethod(magic)] - fn length_hint(&self, vm: &VirtualMachine) -> PyResult { + fn length_hint(&self, vm: &VirtualMachine) -> PyObjectRef { self.internal.length_hint( || { - Ok(self - .internal + self.internal .obj .read() .payload::() - .unwrap() - .len()) + .map(|x| x.len()) }, vm, ) diff --git a/vm/src/builtins/bytes.rs b/vm/src/builtins/bytes.rs index a94da0a17..616fb081c 100644 --- a/vm/src/builtins/bytes.rs +++ b/vm/src/builtins/bytes.rs @@ -594,9 +594,15 @@ impl PyValue for PyBytesIterator { #[pyimpl(with(SlotIterator))] impl PyBytesIterator { #[pymethod(magic)] - fn length_hint(&self, vm: &VirtualMachine) -> PyResult { + fn length_hint(&self, vm: &VirtualMachine) -> PyObjectRef { self.internal.length_hint( - || Ok(self.internal.obj.read().payload::().unwrap().len()), + || { + self.internal + .obj + .read() + .payload::() + .map(|x| x.len()) + }, vm, ) } diff --git a/vm/src/builtins/iter.rs b/vm/src/builtins/iter.rs index 3a578106f..54065926f 100644 --- a/vm/src/builtins/iter.rs +++ b/vm/src/builtins/iter.rs @@ -79,18 +79,21 @@ impl PositionIterInternal { } } - pub fn length_hint(&self, f: F, vm: &VirtualMachine) -> PyResult + pub fn length_hint(&self, f: F, vm: &VirtualMachine) -> PyObjectRef where - F: FnOnce() -> PyResult, + F: FnOnce() -> Option, { let len = if self.is_active(vm) { let pos = self.position.load(); - let obj_len = f()?; - obj_len.saturating_sub(pos) + if let Some(obj_len) = f() { + obj_len.saturating_sub(pos) + } else { + return vm.ctx.not_implemented(); + } } else { 0 }; - Ok(PyInt::from(len).into_object(vm)) + PyInt::from(len).into_object(vm) } } @@ -127,11 +130,10 @@ impl PySequenceIterator { } #[pymethod(magic)] - fn length_hint(&self, vm: &VirtualMachine) -> PyResult { + fn length_hint(&self, vm: &VirtualMachine) -> PyObjectRef { self.internal.length_hint( || { - vm.obj_len(&self.internal.obj.read()) - .map_err(|_| vm.new_not_implemented_error("".to_owned())) + vm.obj_len(&self.internal.obj.read()).ok() }, vm, ) diff --git a/vm/src/builtins/tuple.rs b/vm/src/builtins/tuple.rs index 160f01d47..3ee0edce4 100644 --- a/vm/src/builtins/tuple.rs +++ b/vm/src/builtins/tuple.rs @@ -331,9 +331,9 @@ impl PyValue for PyTupleIterator { #[pyimpl(with(SlotIterator))] impl PyTupleIterator { #[pymethod(magic)] - fn length_hint(&self, vm: &VirtualMachine) -> PyResult { + fn length_hint(&self, vm: &VirtualMachine) -> PyObjectRef { self.internal.length_hint( - || Ok(self.internal.obj.read().payload::().unwrap().len()), + || self.internal.obj.read().payload::().map(|x| x.len()), vm, ) }