blueloveTH 1 vuosi sitten
vanhempi
commit
f2be5cf0f4
4 muutettua tiedostoa jossa 12 lisäystä ja 6 poistoa
  1. 3 0
      .gitignore
  2. 1 1
      include/pocketpy/objects/namedict.h
  3. 6 3
      src/interpreter/vm.c
  4. 2 2
      src/objects/namedict.c

+ 3 - 0
.gitignore

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

+ 1 - 1
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*));

+ 6 - 3
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

+ 2 - 2
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);
 }