mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-23 04:50:17 +00:00
commit 7e52f767ca130a49abb90ec922d74d2f5e9be078 Author: blueloveTH <blueloveTH@foxmail.com> Date: Sat Jun 1 12:49:46 2024 +0800 some optimize commit 3e2ad5b1fbad4367c80ea1325d1aa379282c10c4 Author: blueloveTH <blueloveTH@foxmail.com> Date: Sat Jun 1 12:29:53 2024 +0800 some fix commit bc0e530c72896a23cb6616ff4197ac36913389a4 Author: blueloveTH <blueloveTH@foxmail.com> Date: Sat Jun 1 00:00:47 2024 +0800 some fix commit f17ddcf8299c5d6803085cd3263181f44284f31b Author: blueloveTH <blueloveTH@foxmail.com> Date: Fri May 31 23:56:15 2024 +0800 some fix commit cc63926c8bb89df2d99d8c92c2e18bd5a0180a2c Author: blueloveTH <blueloveTH@foxmail.com> Date: Fri May 31 23:44:09 2024 +0800 some fix commit 3d3fb042651579cbdbcf3255398276ebb7b81e58 Author: blueloveTH <blueloveth@foxmail.com> Date: Fri May 31 17:28:13 2024 +0800 deprecate `PK_OBJ_MARK` commit 3df5f1cf128f157fb3a7aac2ceeeb47c55f5bb3b Author: blueloveTH <blueloveth@foxmail.com> Date: Fri May 31 17:18:34 2024 +0800 init
81 lines
1.8 KiB
C++
81 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include "cffi.h"
|
|
#include "common.h"
|
|
#include "frame.h"
|
|
|
|
namespace pkpy{
|
|
|
|
struct RangeIter{ // step > 0
|
|
Range r;
|
|
i64 current;
|
|
RangeIter(Range r) : r(r), current(r.start) {}
|
|
|
|
static void _register(VM* vm, PyObject* mod, PyObject* type);
|
|
};
|
|
|
|
struct RangeIterR{ // step < 0
|
|
Range r;
|
|
i64 current;
|
|
RangeIterR(Range r) : r(r), current(r.start) {}
|
|
|
|
static void _register(VM* vm, PyObject* mod, PyObject* type);
|
|
};
|
|
|
|
struct ArrayIter{
|
|
PyObject* ref;
|
|
PyVar* end;
|
|
PyVar* current;
|
|
|
|
ArrayIter(PyObject* ref, PyVar* begin, PyVar* end)
|
|
: ref(ref), end(end), current(begin) {}
|
|
|
|
void _gc_mark(VM* vm) const{ vm->__obj_gc_mark(ref); }
|
|
static void _register(VM* vm, PyObject* mod, PyObject* type);
|
|
};
|
|
|
|
struct StringIter{
|
|
PyVar ref;
|
|
int i; // byte index
|
|
StringIter(PyVar ref) : ref(ref), i(0) {}
|
|
void _gc_mark(VM* vm) const{ vm->obj_gc_mark(ref); }
|
|
static void _register(VM* vm, PyObject* mod, PyObject* type);
|
|
};
|
|
|
|
struct Generator{
|
|
LinkedFrame* lf;
|
|
int state; // 0,1,2
|
|
List s_backup;
|
|
|
|
Generator(LinkedFrame* lf, ArgsView buffer): lf(lf), state(0) {
|
|
for(PyVar obj: buffer) s_backup.push_back(obj);
|
|
}
|
|
|
|
void _gc_mark(VM* vm) {
|
|
if(lf == nullptr) return;
|
|
lf->frame._gc_mark(vm);
|
|
vm->__stack_gc_mark(s_backup.begin(), s_backup.end());
|
|
}
|
|
|
|
PyVar next(VM* vm);
|
|
static void _register(VM* vm, PyObject* mod, PyObject* type);
|
|
|
|
~Generator(){
|
|
if(lf){
|
|
lf->~LinkedFrame();
|
|
pool128_dealloc(lf);
|
|
}
|
|
}
|
|
};
|
|
|
|
struct DictItemsIter{
|
|
PyVar ref;
|
|
int i;
|
|
DictItemsIter(PyVar ref) : ref(ref) {
|
|
i = PK_OBJ_GET(Dict, ref)._head_idx;
|
|
}
|
|
void _gc_mark(VM* vm) const{ vm->obj_gc_mark(ref); }
|
|
static void _register(VM* vm, PyObject* mod, PyObject* type);
|
|
};
|
|
|
|
} // namespace pkpy
|