diff --git a/include/pocketpy/obj.h b/include/pocketpy/obj.h index 256d8fe7..53497c93 100644 --- a/include/pocketpy/obj.h +++ b/include/pocketpy/obj.h @@ -188,11 +188,7 @@ obj_get_t PyVar::obj_get(){ } #define PK_OBJ_GET(T, obj) (obj).obj_get() - -#define PK_OBJ_MARK(obj) \ - if(!is_tagged(obj) && !(obj)->gc_marked) { \ - vm->__obj_gc_mark(obj.get()); \ - } +#define PK_OBJ_MARK(obj) if(!is_tagged(obj)) vm->__obj_gc_mark(obj.get()); #define VAR(x) py_var(vm, x) #define CAST(T, x) py_cast(vm, x) diff --git a/src/gc.cpp b/src/gc.cpp index 6882d3f2..aaa2a3c3 100644 --- a/src/gc.cpp +++ b/src/gc.cpp @@ -5,13 +5,12 @@ namespace pkpy{ int ManagedHeap::sweep(){ std::vector alive; for(PyObject* obj: gen){ - PK_DEBUG_ASSERT(!obj.is_sso) if(obj->gc_marked){ obj->gc_marked = false; alive.push_back(obj); }else{ #if PK_DEBUG_GC_STATS - deleted[obj.type] += 1; + deleted[obj->type] += 1; #endif if(_gc_on_delete) _gc_on_delete(vm, obj); _delete(obj); diff --git a/src/vm.cpp b/src/vm.cpp index d55ee676..fd8d3513 100644 --- a/src/vm.cpp +++ b/src/vm.cpp @@ -428,6 +428,7 @@ bool VM::__py_bool_non_trivial(PyVar obj){ } void VM::__obj_gc_mark(PyObject* obj){ + if(obj->gc_marked) return; obj->gc_marked = true; const PyTypeInfo* ti = _tp_info(obj->type); if(ti->vt._gc_mark) ti->vt._gc_mark(obj->_value_ptr(), this); @@ -1821,9 +1822,7 @@ void Frame::_gc_mark(VM* vm) const { } void ManagedHeap::mark() { - for(PyObject* obj: _no_gc){ - if(!obj->gc_marked) vm->__obj_gc_mark(obj); - } + for(PyObject* obj: _no_gc) vm->__obj_gc_mark(obj); vm->callstack.apply([this](Frame& frame){ frame._gc_mark(vm); }); for(PyVar obj: vm->s_data) PK_OBJ_MARK(obj); for(auto [_, co]: vm->__cached_codes) co->_gc_mark(vm);