diff --git a/include/pocketpy/vm.h b/include/pocketpy/vm.h index f8ccefa8..9c92c61e 100644 --- a/include/pocketpy/vm.h +++ b/include/pocketpy/vm.h @@ -117,6 +117,9 @@ public: NameDict _modules; // loaded modules std::map _lazy_modules; // lazy loaded modules + PyObject* _reg[32]; // registers for user purpose, also used by C-API + static constexpr int REG_COUNT = sizeof(_reg) / sizeof(void*); + PyObject* None; PyObject* True; PyObject* False; diff --git a/src/pocketpy_c.cpp b/src/pocketpy_c.cpp index bc90d03d..fca6f1ce 100644 --- a/src/pocketpy_c.cpp +++ b/src/pocketpy_c.cpp @@ -50,18 +50,20 @@ struct LuaStack: public ValueStackImpl<32>{ return false; \ } -class CVM; -void gc_marker_ex(CVM* vm); class CVM: public VM { public: - LuaStack c_data; + LuaStack c_data; // operation stack PyObject* error; CVM(bool use_stdio, bool enable_os) : VM(enable_os) { - c_data = new LuaStack(); error = nullptr; - heap._gc_marker_ex = (void (*)(VM*)) gc_marker_ex; + heap._gc_marker_ex = [](VM* vm_) { + CVM* vm = (CVM*)vm_; + for(PyObject* obj: vm->c_data) if(obj!=nullptr) PK_OBJ_MARK(obj); + if(vm->error != nullptr) PK_OBJ_MARK(vm->error); + }; + if (!use_stdio) { _stdout = _stderr = [](VM* vm, const Str& s){ PK_UNUSED(vm); @@ -71,10 +73,6 @@ public: } }; -void gc_marker_ex(CVM* vm) { - for(PyObject* obj: *vm->c_data) if(obj!=nullptr) PK_OBJ_MARK(obj); - if(vm->error != nullptr) PK_OBJ_MARK(vm->error); -} //for now I will unpack a tuple automatically, we may not want to handle //it this way, not sure diff --git a/src/vm.cpp b/src/vm.cpp index fed28252..47284c01 100644 --- a/src/vm.cpp +++ b/src/vm.cpp @@ -4,6 +4,7 @@ namespace pkpy{ VM::VM(bool enable_os) : heap(this), enable_os(enable_os) { this->vm = this; + for(int i=0; is_data) PK_OBJ_MARK(obj); if(_gc_marker_ex) _gc_marker_ex(vm); if(vm->_last_exception) PK_OBJ_MARK(vm->_last_exception); + for(int i=0; iREG_COUNT; i++){ + if(vm->_reg[i] != nullptr) PK_OBJ_MARK(vm->_reg[i]); + } } Str obj_type_name(VM *vm, Type type){