Author: Matti Picus <matti.pi...@gmail.com>
Branch: cpyext-debug-type_dealloc
Changeset: r92072:7bd0d7e8d934
Date: 2017-08-04 13:39 +0300
http://bitbucket.org/pypy/pypy/changeset/7bd0d7e8d934/

Log:    maybe holding references from the SLOTS dictionary? it seems not ...

diff --git a/pypy/module/cpyext/object.py b/pypy/module/cpyext/object.py
--- a/pypy/module/cpyext/object.py
+++ b/pypy/module/cpyext/object.py
@@ -61,12 +61,31 @@
 def _dealloc(space, obj):
     # This frees an object after its refcount dropped to zero, so we
     # assert that it is really zero here.
+    from rpython.rlib.rawrefcount import REFCNT_FROM_PYPY
     assert obj.c_ob_refcnt == 0
     pto = obj.c_ob_type
     obj_voidp = rffi.cast(rffi.VOIDP, obj)
     generic_cpy_call(space, pto.c_tp_free, obj_voidp)
     if pto.c_tp_flags & Py_TPFLAGS_HEAPTYPE:
+        from pypy.module.cpyext.slotdefs import SLOTS
+        w_obj = from_ref(space, pto)
+        if pto.c_ob_refcnt <= REFCNT_FROM_PYPY + 1:
+            # remove the to-be-deleted type's functions from slotdef.SLOTS
+            toremove = []
+            typedef = w_obj.layout.typedef
+            for k in SLOTS.keys():
+                if k[0] is typedef:
+                    toremove.append(k)
+            for k in toremove:
+                SLOTS.pop(k)
+                print w_obj.name, k[1]
+        else:
+            print 'not releasing', w_obj.name, 'w/refcnt',pto.c_ob_refcnt - 
REFCNT_FROM_PYPY 
         Py_DecRef(space, rffi.cast(PyObject, pto))
+    else:
+        w_obj = from_ref(space, pto)
+        print 'no decref', w_obj.name, 'w/refcnt',pto.c_ob_refcnt - 
REFCNT_FROM_PYPY 
+        
 
 @cpython_api([PyTypeObjectPtr], PyObject, result_is_ll=True)
 def _PyObject_GC_New(space, type):
diff --git a/pypy/module/cpyext/typeobject.py b/pypy/module/cpyext/typeobject.py
--- a/pypy/module/cpyext/typeobject.py
+++ b/pypy/module/cpyext/typeobject.py
@@ -291,7 +291,7 @@
 
         if not slot_func_helper:
             if typedef is not None:
-                if slot_apifunc is None:
+                if slot_apifunc is None and slot_name in ('tp_new',):
                     slot_apifunc = get_slot_tp_function(space, typedef, 
slot_name)
             if not slot_apifunc:
                 if not we_are_translated():
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to