blueloveTH 2 gadi atpakaļ
vecāks
revīzija
3edd4aca67
3 mainītis faili ar 10 papildinājumiem un 15 dzēšanām
  1. 1 1
      include/pocketpy/gc.h
  2. 6 11
      include/pocketpy/obj.h
  3. 3 3
      src/gc.cpp

+ 1 - 1
include/pocketpy/gc.h

@@ -53,7 +53,7 @@ struct ManagedHeap{
         using __T = Py_<std::decay_t<T>>;
         // https://github.com/pocketpy/pocketpy/issues/94#issuecomment-1594784476
         PyObject* obj = new(pool64_alloc<__T>()) Py_<std::decay_t<T>>(type, std::forward<Args>(args)...);
-        obj->gc.enabled = false;
+        obj->gc_enabled = false;
         _no_gc.push_back(obj);
         return obj;
     }

+ 6 - 11
include/pocketpy/obj.h

@@ -94,14 +94,9 @@ struct Slice {
     Slice(PyObject* start, PyObject* stop, PyObject* step) : start(start), stop(stop), step(step) {}
 };
 
-struct GCHeader {
-    bool enabled;   // whether this object is managed by GC
-    bool marked;    // whether this object is marked
-    GCHeader() : enabled(true), marked(false) {}
-};
-
 struct PyObject{
-    GCHeader gc;
+    bool gc_enabled;    // whether this object is managed by GC
+    bool gc_marked;     // whether this object is marked
     Type type;
     NameDict* _attr;
 
@@ -114,7 +109,7 @@ struct PyObject{
     virtual void _obj_gc_mark() = 0;
     virtual void* _value_ptr() = 0;
 
-    PyObject(Type type) : type(type), _attr(nullptr) {}
+    PyObject(Type type) : gc_enabled(true), gc_marked(false), type(type), _attr(nullptr) {}
 
     virtual ~PyObject();
 
@@ -129,7 +124,7 @@ struct PyObject{
 
 struct PySignalObject: PyObject {
     PySignalObject() : PyObject(0) {
-        gc.enabled = false;
+        gc_enabled = false;
     }
     void _obj_gc_mark() override {}
     void* _value_ptr() override { return nullptr; }
@@ -195,8 +190,8 @@ struct MappingProxy{
 #define PK_OBJ_GET(T, obj) (((Py_<T>*)(obj))->_value)
 
 #define PK_OBJ_MARK(obj) \
-    if(!is_tagged(obj) && !(obj)->gc.marked) {                      \
-        (obj)->gc.marked = true;                                    \
+    if(!is_tagged(obj) && !(obj)->gc_marked) {                      \
+        (obj)->gc_marked = true;                                    \
         (obj)->_obj_gc_mark();                                      \
         if((obj)->is_attr_valid()) gc_mark_namedict((obj)->attr()); \
     }

+ 3 - 3
src/gc.cpp

@@ -5,8 +5,8 @@ namespace pkpy{
     int ManagedHeap::sweep(){
         std::vector<PyObject*> alive;
         for(PyObject* obj: gen){
-            if(obj->gc.marked){
-                obj->gc.marked = false;
+            if(obj->gc_marked){
+                obj->gc_marked = false;
                 alive.push_back(obj);
             }else{
 #if PK_DEBUG_GC_STATS
@@ -19,7 +19,7 @@ namespace pkpy{
         }
 
         // clear _no_gc marked flag
-        for(PyObject* obj: _no_gc) obj->gc.marked = false;
+        for(PyObject* obj: _no_gc) obj->gc_marked = false;
 
         int freed = gen.size() - alive.size();