2009/8/16 Joshua Haberman email@example.com:
On Sun, Aug 16, 2009 at 3:37 PM, "Martin v. Löwis"firstname.lastname@example.org wrote:
So where does the Py_DECREF() for the above Py_INCREF() live? I expected to find this code snippet somewhere, but couldn't:
if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) Py_DECREF(type);
For a regular heaptype, it's in subtype_dealloc:
/* Can't reference self beyond this point */ Py_DECREF(type);
Thanks for the pointer. I noticed that subtype_dealloc is only called for types that are allocated using type_new(). Does this mean that it is not safe to create types in C using just PyType_Ready() and set Py_TPFLAGS_HEAPTYPE on them? The documentation is not clear on this point.
Here is what I would like to do when I create my types dynamically:
- implement tp_alloc and tp_dealloc() to INCREF and DECREF the type.
- not set Py_TPFLAGS_HEAPTYPE.
- set Py_TPFLAGS_HAVE_GC (because instances of my obj can create cycles)
[Note that this is really starting to get off topic for python-dev.]
Why do you need to set Py_TPFLAGS_HEAPTYPE on your C type? Is a normal static type not sufficient? The easiest way to create heaptypes is to simply call PyType_Type.