blueloveTH hai 1 ano
pai
achega
e88744eadc
Modificáronse 3 ficheiros con 4 adicións e 10 borrados
  1. 1 5
      include/pocketpy/obj.h
  2. 1 2
      src/gc.cpp
  3. 2 3
      src/vm.cpp

+ 1 - 5
include/pocketpy/obj.h

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

+ 1 - 2
src/gc.cpp

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

+ 2 - 3
src/vm.cpp

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