From 6b9b5945a35fd62e0dadacf054356f055140c4fe Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Thu, 6 Apr 2023 15:25:13 +0800 Subject: [PATCH] fix a bug --- src/codeobject.h | 8 ++------ src/common.h | 6 +++--- src/frame.h | 8 ++++---- src/gc.h | 22 ++++++++++++++-------- src/iter.h | 12 ++++++------ src/namedict.h | 2 +- src/obj.h | 16 +++++++++------- src/vm.h | 10 ++++------ 8 files changed, 43 insertions(+), 41 deletions(-) diff --git a/src/codeobject.h b/src/codeobject.h index 264f2db9..640cadbd 100644 --- a/src/codeobject.h +++ b/src/codeobject.h @@ -68,14 +68,10 @@ struct CodeObject { void optimize(VM* vm); - void _mark() const { + void _gc_mark() const { for(PyObject* v : consts) OBJ_MARK(v); - for(auto& decl: func_decls){ - decl->kwargs._mark(); - decl->code->_mark(); - } + for(auto& decl: func_decls) decl->_gc_mark(); } }; - } // namespace pkpy \ No newline at end of file diff --git a/src/common.h b/src/common.h index b0175192..771f79d8 100644 --- a/src/common.h +++ b/src/common.h @@ -33,11 +33,11 @@ // debug macros #define DEBUG_NO_BUILTIN_MODULES 0 #define DEBUG_EXTRA_CHECK 0 -#define DEBUG_DIS_EXEC_REPL 0 -#define DEBUG_DIS_EXEC_REPL_MIN 1 +#define DEBUG_DIS_EXEC 0 +#define DEBUG_DIS_EXEC_MIN 1 #define DEBUG_CEVAL_STEP 0 #define DEBUG_FULL_EXCEPTION 0 -#define DEBUG_NO_GC 1 +#define DEBUG_NO_GC 0 #if (defined(__ANDROID__) && __ANDROID_API__ <= 22) || defined(__EMSCRIPTEN__) #define PK_ENABLE_FILEIO 0 diff --git a/src/frame.h b/src/frame.h index c0f1c285..aef2fd21 100644 --- a/src/frame.h +++ b/src/frame.h @@ -154,15 +154,15 @@ struct Frame { _data.pop_back_n(n); } - void _mark() const { + void _gc_mark() const { for(PyObject* obj : _data) OBJ_MARK(obj); OBJ_MARK(_module); - _locals->_mark(); - _closure->_mark(); + if(_locals != nullptr) _locals->_gc_mark(); + if(_closure != nullptr) _closure->_gc_mark(); for(auto& p : s_try_block){ for(PyObject* obj : p.second) OBJ_MARK(obj); } - co->_mark(); + co->_gc_mark(); } }; diff --git a/src/gc.h b/src/gc.h index f0619150..311f6b5f 100644 --- a/src/gc.h +++ b/src/gc.h @@ -133,36 +133,42 @@ struct ManagedHeap{ void mark(VM* vm); }; -inline void NameDict::_mark() const{ +inline void NameDict::_gc_mark() const{ for(uint16_t i=0; i<_capacity; i++){ if(_items[i].first.empty()) continue; OBJ_MARK(_items[i].second); } } -template<> inline void _mark(List& t){ +inline void FuncDecl::_gc_mark() const{ + code->_gc_mark(); + kwargs._gc_mark(); +} + +template<> inline void _gc_mark(List& t){ for(PyObject* obj: t) OBJ_MARK(obj); } -template<> inline void _mark(Tuple& t){ +template<> inline void _gc_mark(Tuple& t){ for(int i=0; i inline void _mark(Function& t){ +template<> inline void _gc_mark(Function& t){ + t.decl->_gc_mark(); if(t._module != nullptr) OBJ_MARK(t._module); - if(t._closure != nullptr) t._closure->_mark(); + if(t._closure != nullptr) t._closure->_gc_mark(); } -template<> inline void _mark(BoundMethod& t){ +template<> inline void _gc_mark(BoundMethod& t){ OBJ_MARK(t.obj); OBJ_MARK(t.method); } -template<> inline void _mark(StarWrapper& t){ +template<> inline void _gc_mark(StarWrapper& t){ OBJ_MARK(t.obj); } -template<> inline void _mark(Super& t){ +template<> inline void _gc_mark(Super& t){ OBJ_MARK(t.first); } // NOTE: std::function may capture some PyObject*, they can not be marked diff --git a/src/iter.h b/src/iter.h index 0a9041d6..e7cf6f04 100644 --- a/src/iter.h +++ b/src/iter.h @@ -37,7 +37,7 @@ public: return p->operator[](index++); } - void _mark() override { + void _gc_mark() const override { OBJ_MARK(ref); } }; @@ -54,7 +54,7 @@ public: return VAR(str->u8_getitem(index++)); } - void _mark() override { + void _gc_mark() const override { OBJ_MARK(ref); } }; @@ -74,14 +74,14 @@ inline PyObject* Generator::next(){ } } -inline void Generator::_mark(){ - if(frame!=nullptr) frame->_mark(); +inline void Generator::_gc_mark() const{ + if(frame != nullptr) frame->_gc_mark(); } template -void _mark(T& t){ +void _gc_mark(T& t) { if constexpr(std::is_base_of_v){ - t._mark(); + t._gc_mark(); } } diff --git a/src/namedict.h b/src/namedict.h index 4a98f5d2..0a8f085f 100644 --- a/src/namedict.h +++ b/src/namedict.h @@ -180,7 +180,7 @@ while(!_items[i].first.empty()) { \ return v; } - void _mark() const; + void _gc_mark() const; #undef HASH_PROBE #undef _hash }; diff --git a/src/obj.h b/src/obj.h index 372b69ae..2362bf95 100644 --- a/src/obj.h +++ b/src/obj.h @@ -38,6 +38,8 @@ struct FuncDecl { bool _2 = kwargs.contains(val); return _0 || _1 || _2; } + + void _gc_mark() const; }; using FuncDecl_ = shared_ptr; @@ -87,7 +89,7 @@ protected: VM* vm; public: BaseIter(VM* vm) : vm(vm) {} - virtual void _mark() {} + virtual void _gc_mark() const {} virtual PyObject* next() = 0; virtual ~BaseIter() = default; }; @@ -107,14 +109,14 @@ struct PyObject { NameDict& attr() noexcept { return *_attr; } PyObject* attr(StrName name) const noexcept { return (*_attr)[name]; } virtual void* value() = 0; - virtual void _mark() = 0; + virtual void _obj_gc_mark() = 0; PyObject(Type type) : type(type) {} virtual ~PyObject() { delete _attr; } }; template -void _mark(T& t); +void _gc_mark(T& t); template struct Py_ : PyObject { @@ -136,16 +138,16 @@ struct Py_ : PyObject { } void* value() override { return &_value; } - void _mark() override { + void _obj_gc_mark() override { if(gc.marked) return; gc.marked = true; - if(_attr != nullptr) _attr->_mark(); - pkpy::_mark(_value); // handle PyObject* inside _value `T` + if(_attr != nullptr) _attr->_gc_mark(); + pkpy::_gc_mark(_value); // handle PyObject* inside _value `T` } }; #define OBJ_GET(T, obj) (((Py_*)(obj))->_value) -#define OBJ_MARK(obj) if(!is_tagged(obj)) obj->_mark() +#define OBJ_MARK(obj) if(!is_tagged(obj)) obj->_obj_gc_mark() #if DEBUG_NO_BUILTIN_MODULES #define OBJ_NAME(obj) Str("") diff --git a/src/vm.h b/src/vm.h index df28f100..bd946aea 100644 --- a/src/vm.h +++ b/src/vm.h @@ -36,7 +36,7 @@ public: : BaseIter(vm), frame(std::move(frame)), state(0) {} PyObject* next() override; - void _mark() override; + void _gc_mark() const override; }; struct PyTypeInfo{ @@ -166,7 +166,7 @@ public: if(_module == nullptr) _module = _main; try { CodeObject_ code = compile(source, filename, mode); -#if DEBUG_DIS_EXEC_REPL +#if DEBUG_DIS_EXEC if(_module == _main) std::cout << disassemble(code) << '\n'; #endif return _exec(code, _module, builtins); @@ -615,7 +615,7 @@ inline Str VM::disassemble(CodeObject_ co){ if(i != co->codes.size() - 1) ss << '\n'; } -#if !DEBUG_DIS_EXEC_REPL_MIN +#if !DEBUG_DIS_EXEC_MIN StrStream consts; consts << "co_consts: "; consts << CAST(Str, asRepr(VAR(co->consts))); @@ -909,9 +909,7 @@ inline PyObject* VM::_exec(){ inline void ManagedHeap::mark(VM *vm) { for(PyObject* obj: _no_gc) OBJ_MARK(obj); - for(auto& frame : vm->callstack.data()){ - frame->_mark(); - } + for(auto& frame : vm->callstack.data()) frame->_gc_mark(); } inline void ManagedHeap::_delete_hook(VM *vm, PyObject *obj){