diff --git a/vm/src/obj/objbytes.rs b/vm/src/obj/objbytes.rs index 9390e7070..2f5bdc0d9 100644 --- a/vm/src/obj/objbytes.rs +++ b/vm/src/obj/objbytes.rs @@ -6,10 +6,11 @@ use std::ops::Deref; use num_traits::ToPrimitive; use crate::function::OptionalArg; -use crate::pyobject::{PyContext, PyIteratorValue, PyObjectRef, PyRef, PyResult, PyValue}; +use crate::pyobject::{PyContext, PyObjectRef, PyRef, PyResult, PyValue}; use crate::vm::VirtualMachine; use super::objint; +use super::objiter::PyIteratorValue; use super::objtype::PyClassRef; #[derive(Debug)] diff --git a/vm/src/obj/objdict.rs b/vm/src/obj/objdict.rs index 061c3477e..5a06fbf99 100644 --- a/vm/src/obj/objdict.rs +++ b/vm/src/obj/objdict.rs @@ -5,11 +5,12 @@ use std::ops::{Deref, DerefMut}; use crate::function::{KwArgs, OptionalArg}; use crate::pyobject::{ - DictProtocol, PyAttributes, PyContext, PyIteratorValue, PyObjectRef, PyRef, PyResult, PyValue, + DictProtocol, PyAttributes, PyContext, PyObjectRef, PyRef, PyResult, PyValue, }; use crate::vm::{ReprGuard, VirtualMachine}; use super::objiter; +use super::objiter::PyIteratorValue; use super::objstr::{self, PyStringRef}; use super::objtype; use crate::obj::objtype::PyClassRef; diff --git a/vm/src/obj/objiter.rs b/vm/src/obj/objiter.rs index 67513a255..c1ffa7773 100644 --- a/vm/src/obj/objiter.rs +++ b/vm/src/obj/objiter.rs @@ -2,7 +2,9 @@ * Various types to support iteration. */ -use crate::pyobject::{PyContext, PyIteratorValue, PyObjectRef, PyRef, PyResult}; +use std::cell::Cell; + +use crate::pyobject::{PyContext, PyObjectRef, PyRef, PyResult, PyValue}; use crate::vm::VirtualMachine; use super::objbytearray::PyByteArray; @@ -10,6 +12,7 @@ use super::objbytes::PyBytes; use super::objrange::PyRange; use super::objsequence; use super::objtype; +use super::objtype::PyClassRef; /* * This helper function is called at multiple places. First, it is called @@ -71,6 +74,21 @@ pub fn new_stop_iteration(vm: &VirtualMachine) -> PyObjectRef { vm.new_exception(stop_iteration_type, "End of iterator".to_string()) } +// TODO: This is a workaround and shouldn't exist. +// Each iterable type should have its own distinct iterator type. +// (however, this boilerplate can be reused for "generic iterator" for types with only __getiter__) +#[derive(Debug)] +pub struct PyIteratorValue { + pub position: Cell, + pub iterated_obj: PyObjectRef, +} + +impl PyValue for PyIteratorValue { + fn class(vm: &VirtualMachine) -> PyClassRef { + vm.ctx.iter_type() + } +} + type PyIteratorValueRef = PyRef; impl PyIteratorValueRef { diff --git a/vm/src/obj/objlist.rs b/vm/src/obj/objlist.rs index dd5eb055b..444b5ad9d 100644 --- a/vm/src/obj/objlist.rs +++ b/vm/src/obj/objlist.rs @@ -4,13 +4,12 @@ use std::fmt; use num_traits::ToPrimitive; use crate::function::{OptionalArg, PyFuncArgs}; -use crate::pyobject::{ - IdProtocol, PyContext, PyIteratorValue, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol, -}; +use crate::pyobject::{IdProtocol, PyContext, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol}; use crate::vm::{ReprGuard, VirtualMachine}; use super::objbool; use super::objint; +use super::objiter::PyIteratorValue; use super::objsequence::{ get_elements, get_elements_cell, get_item, seq_equal, seq_ge, seq_gt, seq_le, seq_lt, seq_mul, PySliceableSequence, diff --git a/vm/src/obj/objrange.rs b/vm/src/obj/objrange.rs index 04c9c273b..5af576bfc 100644 --- a/vm/src/obj/objrange.rs +++ b/vm/src/obj/objrange.rs @@ -6,10 +6,11 @@ use num_integer::Integer; use num_traits::{One, Signed, Zero}; use crate::function::{OptionalArg, PyFuncArgs}; -use crate::pyobject::{Either, PyContext, PyIteratorValue, PyObjectRef, PyRef, PyResult, PyValue}; +use crate::pyobject::{Either, PyContext, PyObjectRef, PyRef, PyResult, PyValue}; use crate::vm::VirtualMachine; use super::objint::{PyInt, PyIntRef}; +use super::objiter::PyIteratorValue; use super::objslice::PySliceRef; use super::objtype::PyClassRef; diff --git a/vm/src/obj/objset.rs b/vm/src/obj/objset.rs index ad82c34de..c048686d7 100644 --- a/vm/src/obj/objset.rs +++ b/vm/src/obj/objset.rs @@ -8,14 +8,13 @@ use std::fmt; use std::hash::{Hash, Hasher}; use crate::function::{OptionalArg, PyFuncArgs}; -use crate::pyobject::{ - PyContext, PyIteratorValue, PyObject, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol, -}; +use crate::pyobject::{PyContext, PyObject, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol}; use crate::vm::{ReprGuard, VirtualMachine}; use super::objbool; use super::objint; use super::objiter; +use super::objiter::PyIteratorValue; use super::objtype; use super::objtype::PyClassRef; diff --git a/vm/src/obj/objtuple.rs b/vm/src/obj/objtuple.rs index a199e34b1..e7dc5d0ea 100644 --- a/vm/src/obj/objtuple.rs +++ b/vm/src/obj/objtuple.rs @@ -3,13 +3,12 @@ use std::fmt; use std::hash::{Hash, Hasher}; use crate::function::OptionalArg; -use crate::pyobject::{ - IdProtocol, PyContext, PyIteratorValue, PyObjectRef, PyRef, PyResult, PyValue, -}; +use crate::pyobject::{IdProtocol, PyContext, PyObjectRef, PyRef, PyResult, PyValue}; use crate::vm::{ReprGuard, VirtualMachine}; use super::objbool; use super::objint; +use super::objiter::PyIteratorValue; use super::objsequence::{ get_elements, get_item, seq_equal, seq_ge, seq_gt, seq_le, seq_lt, seq_mul, }; diff --git a/vm/src/pyobject.rs b/vm/src/pyobject.rs index aa3348be5..3574d71d9 100644 --- a/vm/src/pyobject.rs +++ b/vm/src/pyobject.rs @@ -1,5 +1,5 @@ use std::any::Any; -use std::cell::{Cell, RefCell}; +use std::cell::RefCell; use std::collections::HashMap; use std::fmt; use std::marker::PhantomData; @@ -1127,20 +1127,6 @@ where } } -// TODO: This is a workaround and shouldn't exist. -// Each iterable type should have its own distinct iterator type. -#[derive(Debug)] -pub struct PyIteratorValue { - pub position: Cell, - pub iterated_obj: PyObjectRef, -} - -impl PyValue for PyIteratorValue { - fn class(vm: &VirtualMachine) -> PyClassRef { - vm.ctx.iter_type() - } -} - impl PyObject where T: Sized + PyObjectPayload,