From f2be5cf0f481056d4e2614bf1afec4317e88ae85 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Thu, 6 Feb 2025 14:23:35 +0800 Subject: [PATCH] ... --- .gitignore | 3 +++ include/pocketpy/objects/namedict.h | 2 +- src/interpreter/vm.c | 9 ++++++--- src/objects/namedict.c | 4 ++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index b37883a4..f4b0ceb0 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,6 @@ tests/00_tmp.py docs/C-API/functions.md *.log + + +cmake-build-* diff --git a/include/pocketpy/objects/namedict.h b/include/pocketpy/objects/namedict.h index 92debe8c..4d304b5e 100644 --- a/include/pocketpy/objects/namedict.h +++ b/include/pocketpy/objects/namedict.h @@ -25,4 +25,4 @@ void ModuleDict__dtor(ModuleDict* self); void ModuleDict__set(ModuleDict* self, const char* key, py_TValue val); py_TValue* ModuleDict__try_get(ModuleDict* self, const char* path); bool ModuleDict__contains(ModuleDict* self, const char* path); -void ModuleDict__apply_mark(ModuleDict* self, void (*marker)(PyObject*)); +void ModuleDict__apply_mark(ModuleDict* self, void (*marker)(py_TValue*)); diff --git a/src/interpreter/vm.c b/src/interpreter/vm.c index d0da35ed..ea5f1b5f 100644 --- a/src/interpreter/vm.c +++ b/src/interpreter/vm.c @@ -588,7 +588,9 @@ void PyObject__dtor(PyObject* self) { static void mark_object(PyObject* obj); void pk__mark_value(py_TValue* val) { - if(val->is_ptr) mark_object(val->_obj); + if(val->is_ptr && !val->_obj->gc_marked) { + mark_object(val->_obj); + } } void pk__mark_namedict(NameDict* dict) { @@ -605,7 +607,8 @@ void pk__tp_set_marker(py_Type type, void (*gc_mark)(void*)) { } static void mark_object(PyObject* obj) { - if(obj->gc_marked) return; + assert(!obj->gc_marked); + obj->gc_marked = true; if(obj->slots > 0) { @@ -651,7 +654,7 @@ void ManagedHeap__mark(ManagedHeap* self) { pk__mark_value(&vm->ascii_literals[i]); } // mark modules - ModuleDict__apply_mark(&vm->modules, mark_object); + ModuleDict__apply_mark(&vm->modules, pk__mark_value); // mark types int types_length = vm->types.length; // 0-th type is placeholder diff --git a/src/objects/namedict.c b/src/objects/namedict.c index 922f245a..498fdacb 100644 --- a/src/objects/namedict.c +++ b/src/objects/namedict.c @@ -74,8 +74,8 @@ bool ModuleDict__contains(ModuleDict* self, const char* path) { return ModuleDict__try_get(self, path) != NULL; } -void ModuleDict__apply_mark(ModuleDict *self, void (*marker)(PyObject*)) { +void ModuleDict__apply_mark(ModuleDict *self, void (*marker)(py_TValue*)) { if(self->left) ModuleDict__apply_mark(self->left, marker); if(self->right) ModuleDict__apply_mark(self->right, marker); - marker(self->module._obj); + marker(&self->module); }