Add the following code at the beginning of the extension module.
#if defined(Py_TPFLAGS_GC) && !defined(Py_TPFLAGS_HAVE_GC)
/* Python 2.2 GC compatibility macros */
#define Py_TPFLAGS_HAVE_GC Py_TPFLAGS_GC
#define PyObject_GC_New PyObject_New
#define PyObject_GC_Del PyObject_Del
#define PyObject_GC_Track PyObject_GC_Init
#define PyObject_GC_UnTrack PyObject_GC_Fini
#endif
#ifndef Py_TPFLAGS_HAVE_GC
/* no GC */
#define Py_TPFLAGS_HAVE_GC 0
#define PyObject_GC_New PyObject_New
#define PyObject_GC_Del PyObject_Del
#define PyObject_GC_Track
#define PyObject_GC_UnTrack
#define PyGC_HEAD_SIZE 0
typedef int (*visitproc)(PyObject *, void *);
typedef int (*traverseproc)(PyObject *, visitproc, void *);
#endif
This allows you to use the 2.2 GC API and have it work with 2.0 and 2.1 and be
a no-op for Python < 2.0. Note that you still have to include
PyGC_HEAD_SIZE
in the tp_basicsize
calculation.
To review: use PyObject_GC_New
and PyObject_GC_Del
to
allocate and dellocate the object. Call PyObject_GC_Track
before
returning the object from the "new" function and
PyObject_GC_UnTrack
before starting to deallocate it. Include
Py_TPFLAGS_HAVE_GC
with the tp_flags
. Add
PyGC_HEAD_SIZE
to tp_basicsize
. Define the
tp_traverse
method and optionally the tp_clear
method.