This commit is contained in:
blueloveTH 2024-05-20 00:40:45 +08:00
parent 87453c80a7
commit e88744eadc
3 changed files with 4 additions and 10 deletions

View File

@ -188,11 +188,7 @@ obj_get_t<T> PyVar::obj_get(){
}
#define PK_OBJ_GET(T, obj) (obj).obj_get<T>()
#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<T>(vm, x)

View File

@ -5,13 +5,12 @@ namespace pkpy{
int ManagedHeap::sweep(){
std::vector<PyObject*> 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);

View File

@ -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);