gh-89653: PEP 670: Convert PyUnicode_KIND() macro to function (#92705)

In the limited C API version 3.12, PyUnicode_KIND() is now
implemented as a static inline function. Keep the macro for the
regular C API and for the limited C API version 3.11 and older to
prevent introducing new compiler warnings.

Update _decimal.c and stringlib/eq.h for PyUnicode_KIND().
This commit is contained in:
Victor Stinner 2022-05-13 11:49:56 +02:00 committed by GitHub
parent d81d57e959
commit db388df1d9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 10 deletions

View file

@ -242,9 +242,23 @@ enum PyUnicode_Kind {
PyUnicode_4BYTE_KIND = 4
};
/* Return one of the PyUnicode_*_KIND values defined above. */
// PyUnicode_KIND(): Return one of the PyUnicode_*_KIND values defined above.
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030c0000
// gh-89653: Converting this macro to a static inline function would introduce
// new compiler warnings on "kind < PyUnicode_KIND(str)" (compare signed and
// unsigned numbers) where kind type is an int or on
// "unsigned int kind = PyUnicode_KIND(str)" (cast signed to unsigned).
// Only declare the function as static inline function in the limited C API
// version 3.12 which is stricter.
#define PyUnicode_KIND(op) \
(_PyASCIIObject_CAST(op)->state.kind)
#else
// Limited C API 3.12 and newer
static inline int PyUnicode_KIND(PyObject *op) {
assert(PyUnicode_IS_READY(op));
return _PyASCIIObject_CAST(op)->state.kind;
}
#endif
/* Return a void pointer to the raw unicode buffer. */
static inline void* _PyUnicode_COMPACT_DATA(PyObject *op) {