[New-bugs-announce] [issue43690] [C API] stable_abi.py script must not include PyType_HasFeature() static inline function in the stable ABI

STINNER Victor report at bugs.python.org
Thu Apr 1 05:37:33 EDT 2021


New submission from STINNER Victor <vstinner at python.org>:

I just ran "make regen-limited-abi" and it added PyType_HasFeature():

commit baf10da75072d1f8ec714d3c2c8550d34db343a9
Author: Victor Stinner <vstinner at python.org>
Date:   Thu Apr 1 11:29:46 2021 +0200

    bpo-43688: Run make regen-limited-abi (GH-25134)

diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat
index 3adee103bc..ed20521b7f 100644
--- a/Doc/data/stable_abi.dat
+++ b/Doc/data/stable_abi.dat
@@ -192,6 +192,7 @@ PyExc_ConnectionRefusedError
 PyExc_ConnectionResetError
 PyExc_DeprecationWarning
 PyExc_EOFError
+PyExc_EncodingWarning
 PyExc_EnvironmentError
 PyExc_Exception
 PyExc_FileExistsError
@@ -615,6 +616,7 @@ PyType_GetFlags
 PyType_GetModule
 PyType_GetModuleState
 PyType_GetSlot
+PyType_HasFeature
 PyType_IsSubtype
 PyType_Modified
 PyType_Ready


The problem is that PyType_HasFeature() is currently implemented as a static inline function in the limited C API for best performance.

Issue about PyType_HasFeature() performance in CPython itself:
https://bugs.python.org/issue39542#msg372962

Currently, PyType_HasFeature() is declared in Include/object.h as:

static inline int
PyType_HasFeature(PyTypeObject *type, unsigned long feature)
{
    unsigned long flags;
#ifdef Py_LIMITED_API
    // PyTypeObject is opaque in the limited C API
    flags = PyType_GetFlags(type);
#else
    flags = type->tp_flags;
#endif
    return ((flags & feature) != 0);
}

IMO static inline functions must not be listed in the stable *ABI*. At the ABI level, libpython doesn't export "PyType_HasFeature" symbol:

$ objdump -T /lib64/libpython3.10.so.1.0|grep '\<PyObject_CallFunction\>'
00000000000fedf0 g    DF .text	00000000000000d0  Base        PyObject_CallFunction
$ objdump -T /lib64/libpython3.10.so.1.0|grep '\<PyType_HasFeature\>'
# nothing

"PyObject_CallFunction" symbol is exported, but not "PyType_HasFeature".

--

Maybe for the stable ABI, it would be a good idea to export PyType_HasFeature() as an opaque function. But that's out of the scope of this issue which is about the stable_abi.py script ;-)

----------
components: C API
messages: 389964
nosy: pablogsal, petr.viktorin, vstinner
priority: normal
severity: normal
status: open
title: [C API] stable_abi.py script must not include PyType_HasFeature() static inline function in the stable ABI
versions: Python 3.10

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue43690>
_______________________________________


More information about the New-bugs-announce mailing list