diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index 3e0cc660317ba9..127b50ac479638 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -85,7 +85,7 @@ Object Protocol instead of the :func:`repr`. -.. c:function:: void PyUnstable_Object_Dump(PyObject *op) +.. c:function:: void PyObject_Dump(PyObject *op) Dump an object *op* to ``stderr``. This should only be used for debugging. diff --git a/Doc/whatsnew/3.15.rst b/Doc/whatsnew/3.15.rst index 24a51f87c0f410..12b7adda48b4b1 100644 --- a/Doc/whatsnew/3.15.rst +++ b/Doc/whatsnew/3.15.rst @@ -1105,7 +1105,7 @@ New features * Add :c:func:`PyTuple_FromArray` to create a :class:`tuple` from an array. (Contributed by Victor Stinner in :gh:`111489`.) -* Add :c:func:`PyUnstable_Object_Dump` to dump an object to ``stderr``. +* Add :c:func:`PyObject_Dump` to dump an object to ``stderr``. It should only be used for debugging. (Contributed by Victor Stinner in :gh:`141070`.) diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 85d5edd62e3a72..28c909531dba64 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -295,10 +295,10 @@ PyAPI_FUNC(PyObject *) PyType_GetDict(PyTypeObject *); PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int); PyAPI_FUNC(void) _Py_BreakPoint(void); -PyAPI_FUNC(void) PyUnstable_Object_Dump(PyObject *); +PyAPI_FUNC(void) PyObject_Dump(PyObject *); // Alias for backward compatibility -#define _PyObject_Dump PyUnstable_Object_Dump +#define _PyObject_Dump PyObject_Dump Py_DEPRECATED(3.15) PyAPI_FUNC(PyObject*) _PyObject_GetAttrId(PyObject *, _Py_Identifier *); @@ -391,7 +391,7 @@ PyAPI_FUNC(PyObject *) _PyObject_FunctionStr(PyObject *); but compile away to nothing if NDEBUG is defined. However, before aborting, Python will also try to call - PyUnstable_Object_Dump() on the given object. This may be of use when + PyObject_Dump() on the given object. This may be of use when investigating bugs in which a particular object is corrupt (e.g. buggy a tp_visit method in an extension module breaking the garbage collector), to help locate the broken objects. diff --git a/Include/internal/pycore_global_objects_fini_generated.h b/Include/internal/pycore_global_objects_fini_generated.h index 56bc003ac3e246..3fda728f383f6f 100644 --- a/Include/internal/pycore_global_objects_fini_generated.h +++ b/Include/internal/pycore_global_objects_fini_generated.h @@ -13,7 +13,7 @@ static inline void _PyStaticObject_CheckRefcnt(PyObject *obj) { if (!_Py_IsImmortal(obj)) { fprintf(stderr, "Immortal Object has less refcnt than expected.\n"); - PyUnstable_Object_Dump(obj); + PyObject_Dump(obj); } } #endif diff --git a/Misc/NEWS.d/3.15.0a3.rst b/Misc/NEWS.d/3.15.0a3.rst index 7d52b3d0c80c55..aab21c540fe35f 100644 --- a/Misc/NEWS.d/3.15.0a3.rst +++ b/Misc/NEWS.d/3.15.0a3.rst @@ -1461,7 +1461,7 @@ sqlite when used with multiple sub interpreters. .. nonce: mkrhjQ .. section: C API -Add :c:func:`PyUnstable_Object_Dump` to dump an object to ``stderr``. It +Add :c:func:`!PyUnstable_Object_Dump` to dump an object to ``stderr``. It should only be used for debugging. Patch by Victor Stinner. .. diff --git a/Misc/NEWS.d/next/C_API/2025-12-16-18-39-30.gh-issue-141070.4EKDZ1.rst b/Misc/NEWS.d/next/C_API/2025-12-16-18-39-30.gh-issue-141070.4EKDZ1.rst new file mode 100644 index 00000000000000..09ccd125995e03 --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2025-12-16-18-39-30.gh-issue-141070.4EKDZ1.rst @@ -0,0 +1 @@ +Renamed :c:func:`!PyUnstable_Object_Dump` to :c:func:`PyObject_Dump`. diff --git a/Modules/_testcapi/object.c b/Modules/_testcapi/object.c index a4f76c409c6f78..153b28e5fe2e95 100644 --- a/Modules/_testcapi/object.c +++ b/Modules/_testcapi/object.c @@ -507,12 +507,12 @@ pyobject_dump(PyObject *self, PyObject *args) if (release_gil) { Py_BEGIN_ALLOW_THREADS - PyUnstable_Object_Dump(op); + PyObject_Dump(op); Py_END_ALLOW_THREADS } else { - PyUnstable_Object_Dump(op); + PyObject_Dump(op); } Py_RETURN_NONE; } diff --git a/Objects/object.c b/Objects/object.c index 4fc692bb02940e..ea42990e69b929 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -713,7 +713,7 @@ _PyObject_IsFreed(PyObject *op) /* For debugging convenience. See Misc/gdbinit for some useful gdb hooks */ void -PyUnstable_Object_Dump(PyObject* op) +PyObject_Dump(PyObject* op) { if (_PyObject_IsFreed(op)) { /* It seems like the object memory has been freed: @@ -3157,7 +3157,7 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, /* This might succeed or fail, but we're about to abort, so at least try to provide any extra info we can: */ - PyUnstable_Object_Dump(obj); + PyObject_Dump(obj); fprintf(stderr, "\n"); fflush(stderr); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index f737a885f197a0..fdcbcf51cb62c2 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -547,7 +547,7 @@ unicode_check_encoding_errors(const char *encoding, const char *errors) } /* Disable checks during Python finalization. For example, it allows to - * call PyUnstable_Object_Dump() during finalization for debugging purpose. + * call PyObject_Dump() during finalization for debugging purpose. */ if (_PyInterpreterState_GetFinalizing(interp) != NULL) { return 0; diff --git a/Python/gc.c b/Python/gc.c index d067a6144b0763..2f373dcb402df3 100644 --- a/Python/gc.c +++ b/Python/gc.c @@ -2243,7 +2243,7 @@ _PyGC_Fini(PyInterpreterState *interp) void _PyGC_Dump(PyGC_Head *g) { - PyUnstable_Object_Dump(FROM_GC(g)); + PyObject_Dump(FROM_GC(g)); } diff --git a/Python/pythonrun.c b/Python/pythonrun.c index f2c402eb1a03b5..ec8c2d12ab27fc 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1175,7 +1175,7 @@ _PyErr_Display(PyObject *file, PyObject *unused, PyObject *value, PyObject *tb) } if (print_exception_recursive(&ctx, value) < 0) { PyErr_Clear(); - PyUnstable_Object_Dump(value); + PyObject_Dump(value); fprintf(stderr, "lost sys.stderr\n"); } Py_XDECREF(ctx.seen); @@ -1193,14 +1193,14 @@ PyErr_Display(PyObject *unused, PyObject *value, PyObject *tb) PyObject *file; if (PySys_GetOptionalAttr(&_Py_ID(stderr), &file) < 0) { PyObject *exc = PyErr_GetRaisedException(); - PyUnstable_Object_Dump(value); + PyObject_Dump(value); fprintf(stderr, "lost sys.stderr\n"); - PyUnstable_Object_Dump(exc); + PyObject_Dump(exc); Py_DECREF(exc); return; } if (file == NULL) { - PyUnstable_Object_Dump(value); + PyObject_Dump(value); fprintf(stderr, "lost sys.stderr\n"); return; }