diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index 10a5746997..f6cac07d22 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -13,6 +13,10 @@ extern "C" { PyAPI_FUNC(int) _PyType_CheckConsistency(PyTypeObject *type); PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content); +#ifdef Py_DEBUG +extern int _PyGC_VisitAfterTrack(PyObject *op, void *parent_raw); +#endif + /* Tell the GC to track this object. * * NB: While the object is tracked by the collector, it must be safe to call the @@ -24,8 +28,8 @@ PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content); * * The PyObject_GC_Track() function is the public version of this macro. */ -static inline void _PyObject_GC_TRACK_impl(const char *filename, int lineno, - PyObject *op) +static inline void +_PyObject_GC_TRACK_impl(const char *filename, int lineno, PyObject *op) { _PyObject_ASSERT_FROM(op, !_PyObject_GC_IS_TRACKED(op), "object already tracked by the garbage collector", @@ -44,6 +48,13 @@ static inline void _PyObject_GC_TRACK_impl(const char *filename, int lineno, _PyGCHead_SET_PREV(gc, last); _PyGCHead_SET_NEXT(gc, generation0); generation0->_gc_prev = (uintptr_t)gc; + +#ifdef Py_DEBUG + /* Check that the object is valid: validate objects traversed + by tp_traverse() */ + traverseproc traverse = Py_TYPE(op)->tp_traverse; + (void)traverse(op, _PyGC_VisitAfterTrack, op); +#endif } #define _PyObject_GC_TRACK(op) \ diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index cf164c17d7..7d54877e51 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -2156,8 +2156,8 @@ _PyGC_Dump(PyGC_Head *g) #ifdef Py_DEBUG -static int -visit_validate(PyObject *op, void *parent_raw) +int +_PyGC_VisitAfterTrack(PyObject *op, void *parent_raw) { PyObject *parent = _PyObject_CAST(parent_raw); if (_PyObject_IsFreed(op)) { @@ -2182,13 +2182,6 @@ PyObject_GC_Track(void *op_raw) "by the garbage collector"); } _PyObject_GC_TRACK(op); - -#ifdef Py_DEBUG - /* Check that the object is valid: validate objects traversed - by tp_traverse() */ - traverseproc traverse = Py_TYPE(op)->tp_traverse; - (void)traverse(op, visit_validate, op); -#endif } void