On Sun, Aug 16, 2009 at 3:37 PM, "Martin v. Löwis"<[email protected]> 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)
Does this seem safe? I notice that subtype_dealloc() does some funky
GC/trashcan stuff. Is it safe for me not to call subtype_dealloc? Can I
safely implement my tp_dealloc function like this?
void my_tp_dealloc(PyObject *obj)
{
obj->ob_type->tp_free(obj);
Py_DECREF(obj->ob_type);
}
Thanks,
Josh
_______________________________________________
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com