This commit is contained in:
blueloveTH 2025-02-06 14:23:35 +08:00
parent ba25fd4710
commit f2be5cf0f4
4 changed files with 12 additions and 6 deletions

3
.gitignore vendored
View File

@ -37,3 +37,6 @@ tests/00_tmp.py
docs/C-API/functions.md docs/C-API/functions.md
*.log *.log
cmake-build-*

View File

@ -25,4 +25,4 @@ void ModuleDict__dtor(ModuleDict* self);
void ModuleDict__set(ModuleDict* self, const char* key, py_TValue val); void ModuleDict__set(ModuleDict* self, const char* key, py_TValue val);
py_TValue* ModuleDict__try_get(ModuleDict* self, const char* path); py_TValue* ModuleDict__try_get(ModuleDict* self, const char* path);
bool ModuleDict__contains(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*));

View File

@ -588,7 +588,9 @@ void PyObject__dtor(PyObject* self) {
static void mark_object(PyObject* obj); static void mark_object(PyObject* obj);
void pk__mark_value(py_TValue* val) { 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) { 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) { static void mark_object(PyObject* obj) {
if(obj->gc_marked) return; assert(!obj->gc_marked);
obj->gc_marked = true; obj->gc_marked = true;
if(obj->slots > 0) { if(obj->slots > 0) {
@ -651,7 +654,7 @@ void ManagedHeap__mark(ManagedHeap* self) {
pk__mark_value(&vm->ascii_literals[i]); pk__mark_value(&vm->ascii_literals[i]);
} }
// mark modules // mark modules
ModuleDict__apply_mark(&vm->modules, mark_object); ModuleDict__apply_mark(&vm->modules, pk__mark_value);
// mark types // mark types
int types_length = vm->types.length; int types_length = vm->types.length;
// 0-th type is placeholder // 0-th type is placeholder

View File

@ -74,8 +74,8 @@ bool ModuleDict__contains(ModuleDict* self, const char* path) {
return ModuleDict__try_get(self, path) != NULL; 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->left) ModuleDict__apply_mark(self->left, marker);
if(self->right) ModuleDict__apply_mark(self->right, marker); if(self->right) ModuleDict__apply_mark(self->right, marker);
marker(self->module._obj); marker(&self->module);
} }