This commit is contained in:
blueloveTH 2024-07-09 23:39:15 +08:00
parent 5d99323321
commit 554363e66f
3 changed files with 57 additions and 18 deletions

View File

@ -13,8 +13,7 @@ typedef struct pk_ManagedHeap{
int gc_counter; int gc_counter;
pk_VM* vm; pk_VM* vm;
void (*_gc_on_delete)(pk_VM*, PyObject*); void (*gc_on_delete)(pk_VM*, PyObject*);
void (*_gc_marker_ex)(pk_VM*);
} pk_ManagedHeap; } pk_ManagedHeap;
void pk_ManagedHeap__ctor(pk_ManagedHeap* self, pk_VM* vm); void pk_ManagedHeap__ctor(pk_ManagedHeap* self, pk_VM* vm);

View File

@ -10,8 +10,7 @@ void pk_ManagedHeap__ctor(pk_ManagedHeap *self, pk_VM *vm){
self->gc_counter = 0; self->gc_counter = 0;
self->vm = vm; self->vm = vm;
self->_gc_on_delete = NULL; self->gc_on_delete = NULL;
self->_gc_marker_ex = NULL;
} }
void pk_ManagedHeap__dtor(pk_ManagedHeap *self){ void pk_ManagedHeap__dtor(pk_ManagedHeap *self){
@ -54,8 +53,8 @@ int pk_ManagedHeap__sweep(pk_ManagedHeap *self){
obj->gc_marked = false; obj->gc_marked = false;
c11_vector__push(PyObject*, &alive, obj); c11_vector__push(PyObject*, &alive, obj);
} else { } else {
if(self->_gc_on_delete){ if(self->gc_on_delete){
self->_gc_on_delete(self->vm, obj); self->gc_on_delete(self->vm, obj);
} }
PyObject__delete(obj); PyObject__delete(obj);
} }

View File

@ -509,19 +509,60 @@ void PyObject__delete(PyObject* self) {
} }
} }
static void mark_object(PyObject* obj);
static void mark_value(py_TValue* val) {
if(val->is_ptr) mark_object(val->_obj);
}
static void mark_object(PyObject* obj) {
if(obj->gc_marked) return;
obj->gc_marked = true;
// list is a special case
if(obj->type == tp_list) {
c11_vector* vec = PyObject__userdata(obj);
c11__foreach(py_TValue, vec, p) mark_value(p);
return;
}
if(obj->slots > 0) {
py_TValue* p = PyObject__slots(obj);
for(int i = 0; i < obj->slots; i++)
mark_value(p + i);
return;
}
if(obj->slots == -1) {
pk_NameDict* dict = PyObject__dict(obj);
for(int j = 0; j < dict->count; j++) {
pk_NameDict_KV* kv = c11__at(pk_NameDict_KV, dict, j);
mark_value(&kv->value);
}
return;
}
}
void pk_ManagedHeap__mark(pk_ManagedHeap* self) { void pk_ManagedHeap__mark(pk_ManagedHeap* self) {
// for(int i=0; i<self->no_gc.count; i++){ pk_VM* vm = self->vm;
// PyObject* obj = c11__getitem(PyObject*, &self->no_gc, i); // mark heap objects
// vm->__obj_gc_mark(obj); for(int i = 0; i < self->no_gc.count; i++) {
// } PyObject* obj = c11__getitem(PyObject*, &self->no_gc, i);
// vm->callstack.apply([vm](Frame& frame) { mark_object(obj);
// frame._gc_mark(vm); }
// }); // mark value stack
// vm->obj_gc_mark(vm->__last_exception); for(py_TValue* p = vm->stack.begin; p != vm->stack.end; p++) {
// vm->obj_gc_mark(vm->__curr_class); mark_value(p);
// vm->obj_gc_mark(vm->__c.error); }
// vm->__stack_gc_mark(vm->s_data.begin(), vm->s_data.end());
// if(self->_gc_marker_ex) self->_gc_marker_ex((pkpy_VM*)vm); // mark vm's registers
mark_value(&vm->last_retval);
mark_value(&vm->last_exception);
for(int i = 0; i < c11__count_array(vm->reg); i++) {
mark_value(&vm->reg[i]);
}
mark_value(&vm->__curr_class);
} }
void pk_print_stack(pk_VM* self, Frame* frame, Bytecode byte) { void pk_print_stack(pk_VM* self, Frame* frame, Bytecode byte) {