diff --git a/stdlib/src/array.rs b/stdlib/src/array.rs index aee4ab65a..9b52ce379 100644 --- a/stdlib/src/array.rs +++ b/stdlib/src/array.rs @@ -1405,7 +1405,7 @@ mod array { internal: PyMutex>, } - #[pyclass(with(IterNext), flags(HAS_DICT))] + #[pyclass(with(IterNext, Iterable), flags(HAS_DICT))] impl PyArrayIter { #[pymethod(magic)] fn setstate(&self, state: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> { diff --git a/stdlib/src/csv.rs b/stdlib/src/csv.rs index c49dec079..8ed159237 100644 --- a/stdlib/src/csv.rs +++ b/stdlib/src/csv.rs @@ -8,7 +8,7 @@ mod _csv { function::{ArgIterable, ArgumentError, FromArgs, FuncArgs}, match_class, protocol::{PyIter, PyIterReturn}, - types::{IterNext, IterNextIterable}, + types::{IterNext, IterNextIterable, Iterable}, AsObject, Py, PyObjectRef, PyPayload, PyResult, TryFromObject, VirtualMachine, }; use itertools::{self, Itertools}; @@ -166,7 +166,7 @@ mod _csv { } } - #[pyclass(with(IterNext))] + #[pyclass(with(IterNext, Iterable))] impl Reader {} impl IterNextIterable for Reader {} impl IterNext for Reader { diff --git a/stdlib/src/pystruct.rs b/stdlib/src/pystruct.rs index 96c6d9dd2..6ab6bba2b 100644 --- a/stdlib/src/pystruct.rs +++ b/stdlib/src/pystruct.rs @@ -15,7 +15,7 @@ pub(crate) mod _struct { function::{ArgBytesLike, ArgMemoryBuffer, PosArgs}, match_class, protocol::PyIterReturn, - types::{Constructor, IterNext, IterNextIterable}, + types::{Constructor, IterNext, IterNextIterable, Iterable}, AsObject, Py, PyObjectRef, PyPayload, PyResult, TryFromObject, VirtualMachine, }; use crossbeam_utils::atomic::AtomicCell; @@ -194,7 +194,7 @@ pub(crate) mod _struct { } } - #[pyclass(with(IterNext))] + #[pyclass(with(IterNext, Iterable))] impl UnpackIterator { #[pymethod(magic)] fn length_hint(&self) -> usize { diff --git a/stdlib/src/sqlite.rs b/stdlib/src/sqlite.rs index addc781ac..00e9a142f 100644 --- a/stdlib/src/sqlite.rs +++ b/stdlib/src/sqlite.rs @@ -1377,7 +1377,7 @@ mod _sqlite { statement: Option>, } - #[pyclass(with(Constructor, IterNext), flags(BASETYPE))] + #[pyclass(with(Constructor, IterNext, Iterable), flags(BASETYPE))] impl Cursor { fn new( connection: PyRef, diff --git a/vm/src/builtins/asyncgenerator.rs b/vm/src/builtins/asyncgenerator.rs index 287ab920c..ee5c01491 100644 --- a/vm/src/builtins/asyncgenerator.rs +++ b/vm/src/builtins/asyncgenerator.rs @@ -6,7 +6,7 @@ use crate::{ frame::FrameRef, function::OptionalArg, protocol::PyIterReturn, - types::{Constructor, IterNext, IterNextIterable, Representable, Unconstructible}, + types::{Constructor, IterNext, IterNextIterable, Iterable, Representable, Unconstructible}, AsObject, Context, Py, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine, }; @@ -195,7 +195,7 @@ impl PyPayload for PyAsyncGenASend { } } -#[pyclass(with(IterNext))] +#[pyclass(with(IterNext, Iterable))] impl PyAsyncGenASend { #[pymethod(name = "__await__")] fn r#await(zelf: PyRef, _vm: &VirtualMachine) -> PyRef { @@ -290,7 +290,7 @@ impl PyPayload for PyAsyncGenAThrow { } } -#[pyclass(with(IterNext))] +#[pyclass(with(IterNext, Iterable))] impl PyAsyncGenAThrow { #[pymethod(name = "__await__")] fn r#await(zelf: PyRef, _vm: &VirtualMachine) -> PyRef { diff --git a/vm/src/builtins/bytearray.rs b/vm/src/builtins/bytearray.rs index 87757fae3..6d9460285 100644 --- a/vm/src/builtins/bytearray.rs +++ b/vm/src/builtins/bytearray.rs @@ -891,7 +891,7 @@ impl PyPayload for PyByteArrayIterator { } } -#[pyclass(with(Constructor, IterNext))] +#[pyclass(with(Constructor, IterNext, Iterable))] impl PyByteArrayIterator { #[pymethod(magic)] fn length_hint(&self) -> usize { diff --git a/vm/src/builtins/bytes.rs b/vm/src/builtins/bytes.rs index 18ea0d01c..d915e152b 100644 --- a/vm/src/builtins/bytes.rs +++ b/vm/src/builtins/bytes.rs @@ -688,7 +688,7 @@ impl PyPayload for PyBytesIterator { } } -#[pyclass(with(Constructor, IterNext))] +#[pyclass(with(Constructor, IterNext, Iterable))] impl PyBytesIterator { #[pymethod(magic)] fn length_hint(&self) -> usize { diff --git a/vm/src/builtins/coroutine.rs b/vm/src/builtins/coroutine.rs index 440ff46b5..58ea21d2c 100644 --- a/vm/src/builtins/coroutine.rs +++ b/vm/src/builtins/coroutine.rs @@ -5,7 +5,7 @@ use crate::{ frame::FrameRef, function::OptionalArg, protocol::PyIterReturn, - types::{Constructor, IterNext, IterNextIterable, Representable, Unconstructible}, + types::{Constructor, IterNext, IterNextIterable, Iterable, Representable, Unconstructible}, AsObject, Context, Py, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine, }; @@ -128,7 +128,7 @@ impl PyPayload for PyCoroutineWrapper { } } -#[pyclass(with(IterNext))] +#[pyclass(with(IterNext, Iterable))] impl PyCoroutineWrapper { #[pymethod] fn send(&self, val: PyObjectRef, vm: &VirtualMachine) -> PyResult { diff --git a/vm/src/builtins/dict.rs b/vm/src/builtins/dict.rs index b2a191fd9..1b8e886eb 100644 --- a/vm/src/builtins/dict.rs +++ b/vm/src/builtins/dict.rs @@ -839,7 +839,7 @@ macro_rules! dict_view { } } - #[pyclass(with(Constructor, IterNext))] + #[pyclass(with(Constructor, IterNext, Iterable))] impl $iter_name { fn new(dict: PyDictRef) -> Self { $iter_name { @@ -912,7 +912,7 @@ macro_rules! dict_view { } } - #[pyclass(with(Constructor, IterNext))] + #[pyclass(with(Constructor, IterNext, Iterable))] impl $reverse_iter_name { fn new(dict: PyDictRef) -> Self { let size = dict.size(); diff --git a/vm/src/builtins/enumerate.rs b/vm/src/builtins/enumerate.rs index c1582f08d..772187276 100644 --- a/vm/src/builtins/enumerate.rs +++ b/vm/src/builtins/enumerate.rs @@ -7,7 +7,7 @@ use crate::{ convert::ToPyObject, function::OptionalArg, protocol::{PyIter, PyIterReturn}, - types::{Constructor, IterNext, IterNextIterable}, + types::{Constructor, IterNext, IterNextIterable, Iterable}, AsObject, Context, Py, PyObjectRef, PyPayload, PyResult, VirtualMachine, }; use num_bigint::BigInt; @@ -52,7 +52,7 @@ impl Constructor for PyEnumerate { } } -#[pyclass(with(Py, IterNext, Constructor), flags(BASETYPE))] +#[pyclass(with(Py, IterNext, Iterable, Constructor), flags(BASETYPE))] impl PyEnumerate { #[pyclassmethod(magic)] fn class_getitem(cls: PyTypeRef, args: PyObjectRef, vm: &VirtualMachine) -> PyGenericAlias { @@ -97,7 +97,7 @@ impl PyPayload for PyReverseSequenceIterator { } } -#[pyclass(with(IterNext))] +#[pyclass(with(IterNext, Iterable))] impl PyReverseSequenceIterator { pub fn new(obj: PyObjectRef, len: usize) -> Self { let position = len.saturating_sub(1); diff --git a/vm/src/builtins/filter.rs b/vm/src/builtins/filter.rs index 660be88ea..7b69b0e10 100644 --- a/vm/src/builtins/filter.rs +++ b/vm/src/builtins/filter.rs @@ -2,7 +2,7 @@ use super::{PyType, PyTypeRef}; use crate::{ class::PyClassImpl, protocol::{PyIter, PyIterReturn}, - types::{Constructor, IterNext, IterNextIterable}, + types::{Constructor, IterNext, IterNextIterable, Iterable}, Context, Py, PyObjectRef, PyPayload, PyResult, VirtualMachine, }; @@ -32,7 +32,7 @@ impl Constructor for PyFilter { } } -#[pyclass(with(IterNext, Constructor), flags(BASETYPE))] +#[pyclass(with(IterNext, Iterable, Constructor), flags(BASETYPE))] impl PyFilter { #[pymethod(magic)] fn reduce(&self, vm: &VirtualMachine) -> (PyTypeRef, (PyObjectRef, PyIter)) { diff --git a/vm/src/builtins/generator.rs b/vm/src/builtins/generator.rs index 745c33aad..2edb0d6df 100644 --- a/vm/src/builtins/generator.rs +++ b/vm/src/builtins/generator.rs @@ -9,7 +9,7 @@ use crate::{ frame::FrameRef, function::OptionalArg, protocol::PyIterReturn, - types::{Constructor, IterNext, IterNextIterable, Representable, Unconstructible}, + types::{Constructor, IterNext, IterNextIterable, Iterable, Representable, Unconstructible}, AsObject, Context, Py, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine, }; @@ -25,7 +25,7 @@ impl PyPayload for PyGenerator { } } -#[pyclass(with(Py, Constructor, IterNext))] +#[pyclass(with(Py, Constructor, IterNext, Iterable))] impl PyGenerator { pub fn as_coro(&self) -> &Coro { &self.inner diff --git a/vm/src/builtins/iter.rs b/vm/src/builtins/iter.rs index 6f8a01e05..1bc85e83c 100644 --- a/vm/src/builtins/iter.rs +++ b/vm/src/builtins/iter.rs @@ -8,7 +8,7 @@ use crate::{ function::ArgCallable, object::{Traverse, TraverseFn}, protocol::{PyIterReturn, PySequence, PySequenceMethods}, - types::{IterNext, IterNextIterable}, + types::{IterNext, IterNextIterable, Iterable}, Context, Py, PyObject, PyObjectRef, PyPayload, PyResult, VirtualMachine, }; use rustpython_common::{ @@ -189,7 +189,7 @@ impl PyPayload for PySequenceIterator { } } -#[pyclass(with(IterNext))] +#[pyclass(with(IterNext, Iterable))] impl PySequenceIterator { pub fn new(obj: PyObjectRef, vm: &VirtualMachine) -> PyResult { let seq = PySequence::try_protocol(&obj, vm)?; @@ -252,7 +252,7 @@ impl PyPayload for PyCallableIterator { } } -#[pyclass(with(IterNext))] +#[pyclass(with(IterNext, Iterable))] impl PyCallableIterator { pub fn new(callable: ArgCallable, sentinel: PyObjectRef) -> Self { Self { diff --git a/vm/src/builtins/list.rs b/vm/src/builtins/list.rs index 581c0fc9e..2cc038152 100644 --- a/vm/src/builtins/list.rs +++ b/vm/src/builtins/list.rs @@ -543,7 +543,7 @@ impl PyPayload for PyListIterator { } } -#[pyclass(with(Constructor, IterNext))] +#[pyclass(with(Constructor, IterNext, Iterable))] impl PyListIterator { #[pymethod(magic)] fn length_hint(&self) -> usize { @@ -588,7 +588,7 @@ impl PyPayload for PyListReverseIterator { } } -#[pyclass(with(Constructor, IterNext))] +#[pyclass(with(Constructor, IterNext, Iterable))] impl PyListReverseIterator { #[pymethod(magic)] fn length_hint(&self) -> usize { diff --git a/vm/src/builtins/map.rs b/vm/src/builtins/map.rs index 6fb842f41..90878c3f4 100644 --- a/vm/src/builtins/map.rs +++ b/vm/src/builtins/map.rs @@ -4,7 +4,7 @@ use crate::{ class::PyClassImpl, function::PosArgs, protocol::{PyIter, PyIterReturn}, - types::{Constructor, IterNext, IterNextIterable}, + types::{Constructor, IterNext, IterNextIterable, Iterable}, Context, Py, PyObjectRef, PyPayload, PyResult, VirtualMachine, }; @@ -32,7 +32,7 @@ impl Constructor for PyMap { } } -#[pyclass(with(IterNext, Constructor), flags(BASETYPE))] +#[pyclass(with(IterNext, Iterable, Constructor), flags(BASETYPE))] impl PyMap { #[pymethod(magic)] fn length_hint(&self, vm: &VirtualMachine) -> PyResult { diff --git a/vm/src/builtins/memory.rs b/vm/src/builtins/memory.rs index 312364a74..4485d5d12 100644 --- a/vm/src/builtins/memory.rs +++ b/vm/src/builtins/memory.rs @@ -1137,7 +1137,7 @@ impl PyPayload for PyMemoryViewIterator { } } -#[pyclass(with(Constructor, IterNext))] +#[pyclass(with(Constructor, IterNext, Iterable))] impl PyMemoryViewIterator { #[pymethod(magic)] fn reduce(&self, vm: &VirtualMachine) -> PyTupleRef { diff --git a/vm/src/builtins/range.rs b/vm/src/builtins/range.rs index bc15a0909..9cef0b7a5 100644 --- a/vm/src/builtins/range.rs +++ b/vm/src/builtins/range.rs @@ -537,7 +537,7 @@ impl PyPayload for PyLongRangeIterator { } } -#[pyclass(with(Constructor, IterNext))] +#[pyclass(with(Constructor, IterNext, Iterable))] impl PyLongRangeIterator { #[pymethod(magic)] fn length_hint(&self) -> BigInt { @@ -602,7 +602,7 @@ impl PyPayload for PyRangeIterator { } } -#[pyclass(with(Constructor, IterNext))] +#[pyclass(with(Constructor, IterNext, Iterable))] impl PyRangeIterator { #[pymethod(magic)] fn length_hint(&self) -> usize { diff --git a/vm/src/builtins/set.rs b/vm/src/builtins/set.rs index 003b0496e..b495215d6 100644 --- a/vm/src/builtins/set.rs +++ b/vm/src/builtins/set.rs @@ -1232,7 +1232,7 @@ impl PyPayload for PySetIterator { } } -#[pyclass(with(Constructor, IterNext))] +#[pyclass(with(Constructor, IterNext, Iterable))] impl PySetIterator { #[pymethod(magic)] fn length_hint(&self) -> usize { diff --git a/vm/src/builtins/str.rs b/vm/src/builtins/str.rs index 1e29c8d22..146e48d3b 100644 --- a/vm/src/builtins/str.rs +++ b/vm/src/builtins/str.rs @@ -206,7 +206,7 @@ impl PyPayload for PyStrIterator { } } -#[pyclass(with(Constructor, IterNext))] +#[pyclass(with(Constructor, IterNext, Iterable))] impl PyStrIterator { #[pymethod(magic)] fn length_hint(&self) -> usize { diff --git a/vm/src/builtins/tuple.rs b/vm/src/builtins/tuple.rs index 59133b087..283a5d316 100644 --- a/vm/src/builtins/tuple.rs +++ b/vm/src/builtins/tuple.rs @@ -434,7 +434,7 @@ impl PyPayload for PyTupleIterator { } } -#[pyclass(with(Constructor, IterNext))] +#[pyclass(with(Constructor, IterNext, Iterable))] impl PyTupleIterator { #[pymethod(magic)] fn length_hint(&self) -> usize { diff --git a/vm/src/builtins/zip.rs b/vm/src/builtins/zip.rs index d8b28e8eb..5aad48d06 100644 --- a/vm/src/builtins/zip.rs +++ b/vm/src/builtins/zip.rs @@ -4,7 +4,7 @@ use crate::{ class::PyClassImpl, function::{ArgIntoBool, OptionalArg, PosArgs}, protocol::{PyIter, PyIterReturn}, - types::{Constructor, IterNext, IterNextIterable}, + types::{Constructor, IterNext, IterNextIterable, Iterable}, AsObject, Context, Py, PyObjectRef, PyPayload, PyRef, PyResult, TryFromObject, VirtualMachine, }; use rustpython_common::atomic::{self, PyAtomic, Radium}; @@ -41,7 +41,7 @@ impl Constructor for PyZip { } } -#[pyclass(with(IterNext, Constructor), flags(BASETYPE))] +#[pyclass(with(IterNext, Iterable, Constructor), flags(BASETYPE))] impl PyZip { #[pymethod(magic)] fn reduce(zelf: PyRef, vm: &VirtualMachine) -> PyResult { diff --git a/vm/src/stdlib/collections.rs b/vm/src/stdlib/collections.rs index 5935b124f..34c5e4157 100644 --- a/vm/src/stdlib/collections.rs +++ b/vm/src/stdlib/collections.rs @@ -623,7 +623,7 @@ mod _collections { } } - #[pyclass(with(IterNext, Constructor))] + #[pyclass(with(IterNext, Iterable, Constructor))] impl PyDequeIterator { pub(crate) fn new(deque: PyDequeRef) -> Self { PyDequeIterator { @@ -696,7 +696,7 @@ mod _collections { } } - #[pyclass(with(IterNext, Constructor))] + #[pyclass(with(IterNext, Iterable, Constructor))] impl PyReverseDequeIterator { #[pymethod(magic)] fn length_hint(&self) -> usize { diff --git a/vm/src/stdlib/io.rs b/vm/src/stdlib/io.rs index 3c98c146f..2a9d22446 100644 --- a/vm/src/stdlib/io.rs +++ b/vm/src/stdlib/io.rs @@ -382,7 +382,7 @@ mod _io { #[derive(Debug, PyPayload)] pub struct _IOBase; - #[pyclass(with(IterNext, Destructor), flags(BASETYPE, HAS_DICT))] + #[pyclass(with(IterNext, Iterable, Destructor), flags(BASETYPE, HAS_DICT))] impl _IOBase { #[pymethod] fn seek( diff --git a/vm/src/stdlib/itertools.rs b/vm/src/stdlib/itertools.rs index 66b4eb50d..f8321f22b 100644 --- a/vm/src/stdlib/itertools.rs +++ b/vm/src/stdlib/itertools.rs @@ -16,7 +16,7 @@ mod decl { identifier, protocol::{PyIter, PyIterReturn, PyNumber}, stdlib::sys, - types::{Constructor, IterNext, IterNextIterable, Representable}, + types::{Constructor, IterNext, IterNextIterable, Iterable, Representable}, AsObject, Py, PyObjectRef, PyPayload, PyRef, PyResult, PyWeakRef, TryFromObject, VirtualMachine, }; @@ -32,7 +32,7 @@ mod decl { active: PyRwLock>, } - #[pyclass(with(IterNext), flags(BASETYPE, HAS_DICT))] + #[pyclass(with(IterNext, Iterable), flags(BASETYPE, HAS_DICT))] impl PyItertoolsChain { #[pyslot] fn slot_new(cls: PyTypeRef, args: FuncArgs, vm: &VirtualMachine) -> PyResult { @@ -189,7 +189,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor), flags(BASETYPE))] + #[pyclass(with(IterNext, Iterable, Constructor), flags(BASETYPE))] impl PyItertoolsCompress { #[pymethod(magic)] fn reduce(zelf: PyRef) -> (PyTypeRef, (PyIter, PyIter)) { @@ -249,7 +249,7 @@ mod decl { return Err(vm.new_type_error("a number is required".to_owned())); } - PyItertoolsCount { + Self { cur: PyRwLock::new(start), step, } @@ -258,7 +258,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor, Representable))] + #[pyclass(with(IterNext, Iterable, Constructor, Representable))] impl PyItertoolsCount { // TODO: Implement this // if (lz->cnt == PY_SSIZE_T_MAX) @@ -314,7 +314,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor), flags(BASETYPE))] + #[pyclass(with(IterNext, Iterable, Constructor), flags(BASETYPE))] impl PyItertoolsCycle {} impl IterNextIterable for PyItertoolsCycle {} impl IterNext for PyItertoolsCycle { @@ -378,7 +378,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor, Representable), flags(BASETYPE))] + #[pyclass(with(IterNext, Iterable, Constructor, Representable), flags(BASETYPE))] impl PyItertoolsRepeat { #[pymethod(magic)] fn length_hint(&self, vm: &VirtualMachine) -> PyResult { @@ -456,7 +456,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor), flags(BASETYPE))] + #[pyclass(with(IterNext, Iterable, Constructor), flags(BASETYPE))] impl PyItertoolsStarmap { #[pymethod(magic)] fn reduce(zelf: PyRef) -> (PyTypeRef, (PyObjectRef, PyIter)) { @@ -519,7 +519,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor), flags(BASETYPE))] + #[pyclass(with(IterNext, Iterable, Constructor), flags(BASETYPE))] impl PyItertoolsTakewhile { #[pymethod(magic)] fn reduce(zelf: PyRef) -> (PyTypeRef, (PyObjectRef, PyIter), u32) { @@ -600,7 +600,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor), flags(BASETYPE))] + #[pyclass(with(IterNext, Iterable, Constructor), flags(BASETYPE))] impl PyItertoolsDropwhile { #[pymethod(magic)] fn reduce(zelf: PyRef) -> (PyTypeRef, (PyObjectRef, PyIter), u32) { @@ -719,7 +719,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor))] + #[pyclass(with(IterNext, Iterable, Constructor))] impl PyItertoolsGroupBy { pub(super) fn advance( &self, @@ -795,7 +795,7 @@ mod decl { groupby: PyRef, } - #[pyclass(with(IterNext))] + #[pyclass(with(IterNext, Iterable))] impl PyItertoolsGrouper {} impl IterNextIterable for PyItertoolsGrouper {} impl IterNext for PyItertoolsGrouper { @@ -865,7 +865,7 @@ mod decl { ))) } - #[pyclass(with(IterNext), flags(BASETYPE))] + #[pyclass(with(IterNext, Iterable), flags(BASETYPE))] impl PyItertoolsIslice { #[pyslot] fn slot_new(cls: PyTypeRef, args: FuncArgs, vm: &VirtualMachine) -> PyResult { @@ -1023,7 +1023,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor), flags(BASETYPE))] + #[pyclass(with(IterNext, Iterable, Constructor), flags(BASETYPE))] impl PyItertoolsFilterFalse { #[pymethod(magic)] fn reduce(zelf: PyRef) -> (PyTypeRef, (PyObjectRef, PyIter)) { @@ -1091,7 +1091,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor))] + #[pyclass(with(IterNext, Iterable, Constructor))] impl PyItertoolsAccumulate {} impl IterNextIterable for PyItertoolsAccumulate {} @@ -1199,7 +1199,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor))] + #[pyclass(with(IterNext, Iterable, Constructor))] impl PyItertoolsTee { fn from_iter(iterator: PyIter, vm: &VirtualMachine) -> PyResult { let class = PyItertoolsTee::class(&vm.ctx); @@ -1277,7 +1277,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor))] + #[pyclass(with(IterNext, Iterable, Constructor))] impl PyItertoolsProduct { fn update_idxs(&self, mut idxs: PyRwLockWriteGuard<'_, Vec>) { if idxs.len() == 0 { @@ -1370,7 +1370,7 @@ mod decl { let n = pool.len(); - PyItertoolsCombinations { + Self { pool, indices: PyRwLock::new((0..r).collect()), result: PyRwLock::new(None), @@ -1382,7 +1382,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor))] + #[pyclass(with(IterNext, Iterable, Constructor))] impl PyItertoolsCombinations { #[pymethod(magic)] fn reduce(zelf: PyRef, vm: &VirtualMachine) -> PyTupleRef { @@ -1512,7 +1512,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor))] + #[pyclass(with(IterNext, Iterable, Constructor))] impl PyItertoolsCombinationsWithReplacement {} impl IterNextIterable for PyItertoolsCombinationsWithReplacement {} @@ -1609,7 +1609,7 @@ mod decl { None => n, }; - PyItertoolsPermutations { + Self { pool, indices: PyRwLock::new((0..n).collect()), cycles: PyRwLock::new((0..r.min(n)).map(|i| n - i).collect()), @@ -1622,7 +1622,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor))] + #[pyclass(with(IterNext, Iterable, Constructor))] impl PyItertoolsPermutations {} impl IterNextIterable for PyItertoolsPermutations {} impl IterNext for PyItertoolsPermutations { @@ -1725,7 +1725,7 @@ mod decl { fillvalue: PyRwLock, } - #[pyclass(with(IterNext, Constructor))] + #[pyclass(with(IterNext, Iterable, Constructor))] impl PyItertoolsZipLongest { #[pymethod(magic)] fn reduce(zelf: PyRef, vm: &VirtualMachine) -> PyResult { @@ -1794,7 +1794,7 @@ mod decl { } } - #[pyclass(with(IterNext, Constructor))] + #[pyclass(with(IterNext, Iterable, Constructor))] impl PyItertoolsPairwise {} impl IterNextIterable for PyItertoolsPairwise {} impl IterNext for PyItertoolsPairwise { diff --git a/vm/src/stdlib/os.rs b/vm/src/stdlib/os.rs index e016c21a1..6bac2e7e7 100644 --- a/vm/src/stdlib/os.rs +++ b/vm/src/stdlib/os.rs @@ -316,7 +316,7 @@ pub(super) mod _os { function::{ArgBytesLike, Either, FsPath, FuncArgs, OptionalArg}, protocol::PyIterReturn, recursion::ReprGuard, - types::{IterNext, IterNextIterable, PyStructSequence, Representable}, + types::{IterNext, IterNextIterable, Iterable, PyStructSequence, Representable}, vm::VirtualMachine, AsObject, Py, PyObjectRef, PyPayload, PyRef, PyResult, TryFromObject, }; @@ -791,7 +791,7 @@ pub(super) mod _os { mode: OutputMode, } - #[pyclass(with(IterNext))] + #[pyclass(with(IterNext, Iterable))] impl ScandirIterator { #[pymethod] fn close(&self) { diff --git a/vm/src/types/slot.rs b/vm/src/types/slot.rs index f095b6385..5b3bbd8ba 100644 --- a/vm/src/types/slot.rs +++ b/vm/src/types/slot.rs @@ -305,6 +305,7 @@ fn iter_wrapper(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult { vm.call_special_method(&zelf, identifier!(vm, __iter__), ()) } +// PyObject_IterNextIterable in CPython fn self_iter(zelf: PyObjectRef, _vm: &VirtualMachine) -> PyResult { Ok(zelf) } @@ -1233,7 +1234,6 @@ pub trait AsNumber: PyPayload { #[pyclass] pub trait Iterable: PyPayload { #[pyslot] - #[pymethod(name = "__iter__")] fn slot_iter(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult { let zelf = zelf .downcast() @@ -1241,6 +1241,11 @@ pub trait Iterable: PyPayload { Self::iter(zelf, vm) } + #[pymethod] + fn __iter__(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult { + Self::slot_iter(zelf, vm) + } + fn iter(zelf: PyRef, vm: &VirtualMachine) -> PyResult; fn extend_slots(_slots: &mut PyTypeSlots) {} @@ -1273,8 +1278,13 @@ where T: IterNextIterable, { #[cold] - fn slot_iter(_zelf: PyObjectRef, _vm: &VirtualMachine) -> PyResult { - unreachable!("slot is overriden"); + fn slot_iter(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult { + let repr = zelf.repr(vm)?; + unreachable!("slot must be overriden for {}", repr.as_str()); + } + + fn __iter__(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult { + self_iter(zelf, vm) } #[cold] @@ -1284,6 +1294,6 @@ where fn extend_slots(slots: &mut PyTypeSlots) { let prev = slots.iter.swap(Some(self_iter)); - debug_assert!(prev.is_some()); // slot_iter would be set + debug_assert!(prev.is_some()); // slot_iter would be set } }