diff --git a/crates/capi/src/iterobject.rs b/crates/capi/src/iterobject.rs new file mode 100644 index 000000000..d9fb14821 --- /dev/null +++ b/crates/capi/src/iterobject.rs @@ -0,0 +1,29 @@ +use crate::object::define_py_check; +use crate::{PyObject, pystate::with_vm}; +use rustpython_vm::PyPayload; +use rustpython_vm::TryFromObject; +use rustpython_vm::builtins::{PyCallableIterator, PySequenceIterator}; +use rustpython_vm::function::ArgCallable; + +define_py_check!(exact fn PySeqIter_Check, types.iter_type); +define_py_check!(exact fn PyCallIter_Check, types.callable_iterator); + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PySeqIter_New(seq: *mut PyObject) -> *mut PyObject { + with_vm(|vm| { + let seq = unsafe { &*seq }.to_owned(); + Ok(PySequenceIterator::new(seq, vm)?.into_pyobject(vm)) + }) +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn PyCallIter_New( + callable: *mut PyObject, + sentinel: *mut PyObject, +) -> *mut PyObject { + with_vm(|vm| { + let callable = ArgCallable::try_from_object(vm, unsafe { &*callable }.to_owned())?; + let sentinel = unsafe { &*sentinel }.to_owned(); + Ok(PyCallableIterator::new(callable, sentinel).into_pyobject(vm)) + }) +} diff --git a/crates/capi/src/lib.rs b/crates/capi/src/lib.rs index 2aff75fe1..22d658354 100644 --- a/crates/capi/src/lib.rs +++ b/crates/capi/src/lib.rs @@ -22,6 +22,7 @@ pub mod dictobject; pub mod floatobject; pub mod genericaliasobject; pub mod import; +pub mod iterobject; pub mod listobject; pub mod longobject; pub mod memoryobject;