mirror of
https://github.com/pocketpy/pocketpy
synced 2025-11-10 05:30:16 +00:00
moved deque iterator to collections.cpp
This commit is contained in:
parent
4a189464ad
commit
2226767319
@ -32,34 +32,6 @@ namespace pkpy
|
|||||||
static void _register(VM *vm, PyObject *mod, PyObject *type);
|
static void _register(VM *vm, PyObject *mod, PyObject *type);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PyDequeIter
|
|
||||||
{
|
|
||||||
// Iterator for the deque type
|
|
||||||
PY_CLASS(PyDequeIter, builtins, "_deque_iterator")
|
|
||||||
PyObject *ref;
|
|
||||||
bool is_reversed;
|
|
||||||
std::deque<PyObject *>::iterator begin;
|
|
||||||
std::deque<PyObject *>::iterator end;
|
|
||||||
std::deque<PyObject *>::iterator current;
|
|
||||||
std::deque<PyObject *>::reverse_iterator rbegin;
|
|
||||||
std::deque<PyObject *>::reverse_iterator rend;
|
|
||||||
std::deque<PyObject *>::reverse_iterator rcurrent;
|
|
||||||
|
|
||||||
PyDequeIter(PyObject *ref, std::deque<PyObject *>::iterator begin, std::deque<PyObject *>::iterator end)
|
|
||||||
: ref(ref), begin(begin), end(end), current(begin)
|
|
||||||
{
|
|
||||||
this->is_reversed = false;
|
|
||||||
}
|
|
||||||
PyDequeIter(PyObject *ref, std::deque<PyObject *>::reverse_iterator rbegin, std::deque<PyObject *>::reverse_iterator rend)
|
|
||||||
: ref(ref), rbegin(rbegin), rend(rend), rcurrent(rbegin)
|
|
||||||
{
|
|
||||||
this->is_reversed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _gc_mark() const { PK_OBJ_MARK(ref); }
|
|
||||||
static void _register(VM *vm, PyObject *mod, PyObject *type);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct StringIter
|
struct StringIter
|
||||||
{
|
{
|
||||||
PY_CLASS(StringIter, builtins, "_string_iterator")
|
PY_CLASS(StringIter, builtins, "_string_iterator")
|
||||||
|
|||||||
@ -1,6 +1,57 @@
|
|||||||
#include "pocketpy/collections.h"
|
#include "pocketpy/collections.h"
|
||||||
namespace pkpy
|
namespace pkpy
|
||||||
{
|
{
|
||||||
|
struct PyDequeIter
|
||||||
|
{
|
||||||
|
// Iterator for the deque type
|
||||||
|
PY_CLASS(PyDequeIter, builtins, "_deque_iterator")
|
||||||
|
PyObject *ref;
|
||||||
|
bool is_reversed;
|
||||||
|
std::deque<PyObject *>::iterator begin;
|
||||||
|
std::deque<PyObject *>::iterator end;
|
||||||
|
std::deque<PyObject *>::iterator current;
|
||||||
|
std::deque<PyObject *>::reverse_iterator rbegin;
|
||||||
|
std::deque<PyObject *>::reverse_iterator rend;
|
||||||
|
std::deque<PyObject *>::reverse_iterator rcurrent;
|
||||||
|
|
||||||
|
PyDequeIter(PyObject *ref, std::deque<PyObject *>::iterator begin, std::deque<PyObject *>::iterator end)
|
||||||
|
: ref(ref), begin(begin), end(end), current(begin)
|
||||||
|
{
|
||||||
|
this->is_reversed = false;
|
||||||
|
}
|
||||||
|
PyDequeIter(PyObject *ref, std::deque<PyObject *>::reverse_iterator rbegin, std::deque<PyObject *>::reverse_iterator rend)
|
||||||
|
: ref(ref), rbegin(rbegin), rend(rend), rcurrent(rbegin)
|
||||||
|
{
|
||||||
|
this->is_reversed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _gc_mark() const { PK_OBJ_MARK(ref); }
|
||||||
|
static void _register(VM *vm, PyObject *mod, PyObject *type);
|
||||||
|
};
|
||||||
|
void PyDequeIter::_register(VM *vm, PyObject *mod, PyObject *type)
|
||||||
|
{
|
||||||
|
// Iterator for the deque type
|
||||||
|
vm->_all_types[PK_OBJ_GET(Type, type)].subclass_enabled = false;
|
||||||
|
vm->bind_notimplemented_constructor<PyDequeIter>(type);
|
||||||
|
|
||||||
|
vm->bind__iter__(PK_OBJ_GET(Type, type), [](VM *vm, PyObject *obj)
|
||||||
|
{ return obj; });
|
||||||
|
vm->bind__next__(PK_OBJ_GET(Type, type), [](VM *vm, PyObject *obj)
|
||||||
|
{
|
||||||
|
PyDequeIter& self = _CAST(PyDequeIter&, obj);
|
||||||
|
if(self.is_reversed){
|
||||||
|
if(self.rcurrent == self.rend) return vm->StopIteration;
|
||||||
|
PyObject* ret = *self.rcurrent;
|
||||||
|
++self.rcurrent;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if(self.current == self.end) return vm->StopIteration;
|
||||||
|
PyObject* ret = *self.current;
|
||||||
|
++self.current;
|
||||||
|
return ret;
|
||||||
|
} });
|
||||||
|
}
|
||||||
// STARTING HERE
|
// STARTING HERE
|
||||||
struct PyDeque
|
struct PyDeque
|
||||||
{
|
{
|
||||||
@ -415,9 +466,9 @@ namespace pkpy
|
|||||||
}
|
}
|
||||||
if (!vm->py_equals(iterable, vm->None))
|
if (!vm->py_equals(iterable, vm->None))
|
||||||
{
|
{
|
||||||
this->dequeItems.clear(); // clear the deque
|
this->dequeItems.clear(); // clear the deque
|
||||||
auto _lock = vm->heap.gc_scope_lock(); // locking the heap
|
auto _lock = vm->heap.gc_scope_lock(); // locking the heap
|
||||||
PyObject *it = vm->py_iter(iterable); // strong ref
|
PyObject *it = vm->py_iter(iterable); // strong ref
|
||||||
PyObject *obj = vm->py_next(it);
|
PyObject *obj = vm->py_next(it);
|
||||||
while (obj != vm->StopIteration)
|
while (obj != vm->StopIteration)
|
||||||
{
|
{
|
||||||
@ -563,6 +614,7 @@ namespace pkpy
|
|||||||
{
|
{
|
||||||
PyObject *mod = vm->new_module("collections");
|
PyObject *mod = vm->new_module("collections");
|
||||||
PyDeque::register_class(vm, mod);
|
PyDeque::register_class(vm, mod);
|
||||||
|
PyDequeIter::register_class(vm, vm->builtins);
|
||||||
CodeObject_ code = vm->compile(kPythonLibs["collections"], "collections.py", EXEC_MODE);
|
CodeObject_ code = vm->compile(kPythonLibs["collections"], "collections.py", EXEC_MODE);
|
||||||
vm->_exec(code, mod);
|
vm->_exec(code, mod);
|
||||||
}
|
}
|
||||||
|
|||||||
23
src/iter.cpp
23
src/iter.cpp
@ -26,29 +26,6 @@ namespace pkpy{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void PyDequeIter::_register(VM* vm, PyObject* mod, PyObject* type){
|
|
||||||
// Iterator for the deque type
|
|
||||||
vm->_all_types[PK_OBJ_GET(Type, type)].subclass_enabled = false;
|
|
||||||
vm->bind_notimplemented_constructor<PyDequeIter>(type);
|
|
||||||
|
|
||||||
vm->bind__iter__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){ return obj; });
|
|
||||||
vm->bind__next__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){
|
|
||||||
PyDequeIter& self = _CAST(PyDequeIter&, obj);
|
|
||||||
if(self.is_reversed){
|
|
||||||
if(self.rcurrent == self.rend) return vm->StopIteration;
|
|
||||||
PyObject* ret = *self.rcurrent;
|
|
||||||
++self.rcurrent;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if(self.current == self.end) return vm->StopIteration;
|
|
||||||
PyObject* ret = *self.current;
|
|
||||||
++self.current;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void StringIter::_register(VM* vm, PyObject* mod, PyObject* type){
|
void StringIter::_register(VM* vm, PyObject* mod, PyObject* type){
|
||||||
vm->_all_types[PK_OBJ_GET(Type, type)].subclass_enabled = false;
|
vm->_all_types[PK_OBJ_GET(Type, type)].subclass_enabled = false;
|
||||||
vm->bind_notimplemented_constructor<StringIter>(type);
|
vm->bind_notimplemented_constructor<StringIter>(type);
|
||||||
|
|||||||
@ -1414,7 +1414,6 @@ void init_builtins(VM* _vm) {
|
|||||||
|
|
||||||
RangeIter::register_class(_vm, _vm->builtins);
|
RangeIter::register_class(_vm, _vm->builtins);
|
||||||
ArrayIter::register_class(_vm, _vm->builtins);
|
ArrayIter::register_class(_vm, _vm->builtins);
|
||||||
PyDequeIter::register_class(_vm, _vm->builtins);
|
|
||||||
StringIter::register_class(_vm, _vm->builtins);
|
StringIter::register_class(_vm, _vm->builtins);
|
||||||
Generator::register_class(_vm, _vm->builtins);
|
Generator::register_class(_vm, _vm->builtins);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user