Python "" () () (atomic type)

tp_flags Py_TPFLAGS_HAVE_GC tp_traverse tp_clear

Py_TPFLAGS_HAVE_GC

:

  1. PyObject_GC_New() PyObject_GC_NewVar()
  2. PyObject_GC_Track()
TYPE* PyObject_GC_New(TYPE, PyTypeObject *type)

PyObject_New() Py_TPFLAGS_HAVE_GC

TYPE* PyObject_GC_NewVar(TYPE, PyTypeObject *type, Py_ssize_t size)

PyObject_NewVar() Py_TPFLAGS_HAVE_GC

TYPE* PyObject_GC_Resize(TYPE, PyVarObject *op, Py_ssize_t newsize)

Resize an object allocated by PyObject_NewVar(). Returns the resized object or NULL on failure.

void PyObject_GC_Track(PyObject *op)

op tp_traverse

void _PyObject_GC_TRACK(PyObject *op)

PyObject_GC_Track()

:

  1. PyObject_GC_UnTrack()
  2. PyObject_GC_Del()
void PyObject_GC_Del(void *op)

PyObject_GC_New() PyObject_GC_NewVar()

void PyObject_GC_UnTrack(void *op)

op PyObject_GC_Track() tp_traverse (tp_dealloc )

void _PyObject_GC_UNTRACK(PyObject *op)

PyObject_GC_UnTrack()

tp_traverse :

int (*visitproc)(PyObject *object, void *arg)

tp_traverse (visitor function) object tp_traverse 3 arg Python ;

tp_traverse :

int (*traverseproc)(PyObject *self, visitproc visit, void *arg)

(traversal function) self visit visit arg visit NULL visit

tp_traverse Py_VISIT() tp_traverse visit arg :

void Py_VISIT(PyObject *o)

o NULL o arg visit visit tp_traverse :

static int
my_traverse(Noddy *self, visitproc visit, void *arg)
{
    Py_VISIT(self->foo);
    Py_VISIT(self->bar);
    return 0;
}

tp_clear inquiry (immutable) NULL

int (*inquiry)(PyObject *self)

( Py_DECREF() )