PyAPI_FUNC(void) _Py_ForgetReference(PyObject *);
PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
PyAPI_FUNC(void) _Py_PrintReferences(FILE *);
+PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *);
#else
/* Without Py_TRACE_REFS, there's little enough to do that we expand code
#ifdef Py_TRACE_REFS
/* Head of doubly-linked list of all objects. */
static PyObject refchain = {&refchain, &refchain};
+
+/* Insert op at the fron of the doubly-linked list of all objects. */
+void
+_Py_AddToAllObjects(PyObject *op)
+{
+ op->_ob_next = refchain._ob_next;
+ op->_ob_prev = &refchain;
+ refchain._ob_next->_ob_prev = op;
+ refchain._ob_next = op;
+}
#endif
#ifdef COUNT_ALLOCS
type_list = tp;
#ifdef Py_TRACE_REFS
/* Also insert in the doubly-linked list of all objects. */
- if (tp->_ob_next == NULL) {
- PyObject *op = (PyObject *)tp;
- op->_ob_next = refchain._ob_next;
- op->_ob_prev = &refchain;
- refchain._ob_next->_ob_prev = op;
- refchain._ob_next = op;
+ if (tp->_ob_prev == NULL) {
+ assert(tp->_ob_next == NULL);
+ _Py_AddToAllObjects((PyObject *)tp);
}
#endif
}
{
_Py_INC_REFTOTAL;
op->ob_refcnt = 1;
- op->_ob_next = refchain._ob_next;
- op->_ob_prev = &refchain;
- refchain._ob_next->_ob_prev = op;
- refchain._ob_next = op;
+ _Py_AddToAllObjects(op);
_Py_INC_TPALLOCS(op);
}
type->tp_flags |= Py_TPFLAGS_READYING;
+#ifdef Py_TRACE_REFS
+ /* PyType_Ready is the closest thing we have to a choke point
+ * for type objects, so is the best place I can think of to try
+ * to get type objects into the doubly-linked list of all objects.
+ * Still, not all type objects go thru PyType_Ready.
+ */
+ if (type->_ob_next == NULL) {
+ assert(type->_ob_prev == NULL);
+ _Py_AddToAllObjects((PyObject *)type);
+ }
+#endif
+
/* Initialize tp_base (defaults to BaseObject unless that's us) */
base = type->tp_base;
if (base == NULL && type != &PyBaseObject_Type)