blueloveTH 1 год назад
Родитель
Сommit
39ad3f2ef4
3 измененных файлов с 11 добавлено и 18 удалено
  1. 6 9
      include/pocketpy/gc.h
  2. 2 2
      include/pocketpy/obj.h
  3. 3 7
      src/codeobject.cpp

+ 6 - 9
include/pocketpy/gc.h

@@ -43,24 +43,21 @@ struct ManagedHeap{
         using __T = std::decay_t<T>;
         static_assert(!is_sso_v<__T>, "gcnew cannot be used with SSO types");
         // https://github.com/pocketpy/pocketpy/issues/94#issuecomment-1594784476
-        PyObject* p = new(pool128_alloc(py_sizeof<__T>)) PyObject();
+        PyObject* p = new(pool128_alloc(py_sizeof<__T>)) PyObject(true);
         p->placement_new<__T>(std::forward<Args>(args)...);
-        PyVar obj(type, p);
-        gen.push_back(obj);
+        gen.emplace_back(type, p);
         gc_counter++;
-        return obj;
+        return gen.back();
     }
 
     template<typename T, typename... Args>
     PyVar _new(Type type, Args&&... args){
         using __T = std::decay_t<T>;
         static_assert(!is_sso_v<__T>);
-        PyObject* p = new(pool128_alloc<__T>()) PyObject();
+        PyObject* p = new(pool128_alloc<__T>()) PyObject(false);
         p->placement_new<__T>(std::forward<Args>(args)...);
-        PyVar obj(type, p);
-        obj->gc_enabled = false;
-        _no_gc.push_back(obj);
-        return obj;
+        _no_gc.emplace_back(type, p);
+        return _no_gc.back();
     }
 
     void _delete(PyVar);

+ 2 - 2
include/pocketpy/obj.h

@@ -101,7 +101,7 @@ struct Slice {
     void _gc_mark(VM*) const;
 };
 
-struct PyObject{
+struct PyObject final{
     bool gc_enabled;    // whether this object is managed by GC
     bool gc_marked;     // whether this object is marked
     NameDict* _attr;
@@ -119,7 +119,7 @@ struct PyObject{
         return (*_attr)[name];
     }
 
-    PyObject() : gc_enabled(true), gc_marked(false), _attr(nullptr) {}
+    PyObject(bool gc_enabled) : gc_enabled(gc_enabled), gc_marked(false), _attr(nullptr) {}
 
     template<typename T, typename ...Args>
     void placement_new(Args&&... args){

+ 3 - 7
src/codeobject.cpp

@@ -7,11 +7,7 @@ namespace pkpy{
             blocks.push_back(CodeBlock(CodeBlockType::NO_BLOCK, -1, 0, 0));
         }
 
-    struct PySignalObject: PyObject {
-        PySignalObject() : PyObject() { gc_enabled = false; }
-    };
-
-    PyVar const PY_NULL(Type(), new PySignalObject());
-    PyVar const PY_OP_CALL(Type(), new PySignalObject());
-    PyVar const PY_OP_YIELD(Type(), new PySignalObject());
+    PyVar const PY_NULL(Type(), new PyObject(false));
+    PyVar const PY_OP_CALL(Type(), new PyObject(false));
+    PyVar const PY_OP_YIELD(Type(), new PyObject(false));
 }   // namespace pkpy