From fc4a487eae512d49a7ce7bb899a52a8d2300ba8e Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Wed, 5 Aug 2026 14:50:47 +0200 Subject: [PATCH] gh-152105: Remove docs snippet that uses internal C API (GH-155122) Follow-up to GH-143490. `_PyInterpreterFrame.f_executable` and `PyStackRef_AsPyObjectBorrow` are undocumented and only available in the internal API. Docs should not suggest using them, even if `PyUnstable_ExecutableKinds` is unusable without them. (cherry picked from commit c5d49463f1a41f0812902f3834cb2aad0adfd0a1) Co-authored-by: Petr Viktorin Co-authored-by: Stan Ulbrych --- Doc/c-api/frame.rst | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/Doc/c-api/frame.rst b/Doc/c-api/frame.rst index a04ef4e422949b..70a610cea82d06 100644 --- a/Doc/c-api/frame.rst +++ b/Doc/c-api/frame.rst @@ -269,29 +269,8 @@ Unless using :pep:`523`, you will not need this. * - .. c:macro:: PyUnstable_EXECUTABLE_KIND_METHOD_DESCRIPTOR - The frame corresponds to a method on a class instance. - However, Python's C API lacks a function to read the executable kind from - a frame. Instead, use this recipe: - - .. code-block:: c - - int - get_executable_kind(PyFrameObject *frame) - { - _PyInterpreterFrame *f = frame->f_frame; - PyObject *exec = PyStackRef_AsPyObjectBorrow(f->f_executable); - - if (PyCode_Check(exec)) { - return PyUnstable_EXECUTABLE_KIND_PY_FUNCTION; - } - if (PyMethod_Check(exec)) { - return PyUnstable_EXECUTABLE_KIND_BUILTIN_FUNCTION; - } - if (Py_IS_TYPE(exec, &PyMethodDescr_Type)) { - return PyUnstable_EXECUTABLE_KIND_METHOD_DESCRIPTOR; - } - - return PyUnstable_EXECUTABLE_KIND_SKIP; - } + Note that reading the executable kind from a frame is currently only + possible with undocumented internal APIs. .. versionadded:: 3.13