gh-89188: Implement PyUnicode_KIND() as a function (#129412)

Implement PyUnicode_KIND() and PyUnicode_DATA() as function, in
addition to the macros with the same names. The macros rely on C bit
fields which have compiler-specific layout.
This commit is contained in:
Victor Stinner 2025-01-30 12:27:27 +01:00 committed by GitHub
parent e1c4ba9288
commit a810cb89f1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 30 additions and 2 deletions

View file

@ -240,6 +240,8 @@ enum PyUnicode_Kind {
PyUnicode_4BYTE_KIND = 4
};
PyAPI_FUNC(int) PyUnicode_KIND(PyObject *op);
// PyUnicode_KIND(): Return one of the PyUnicode_*_KIND values defined above.
//
// gh-89653: Converting this macro to a static inline function would introduce
@ -264,13 +266,15 @@ static inline void* _PyUnicode_NONCOMPACT_DATA(PyObject *op) {
return data;
}
static inline void* PyUnicode_DATA(PyObject *op) {
PyAPI_FUNC(void*) PyUnicode_DATA(PyObject *op);
static inline void* _PyUnicode_DATA(PyObject *op) {
if (PyUnicode_IS_COMPACT(op)) {
return _PyUnicode_COMPACT_DATA(op);
}
return _PyUnicode_NONCOMPACT_DATA(op);
}
#define PyUnicode_DATA(op) PyUnicode_DATA(_PyObject_CAST(op))
#define PyUnicode_DATA(op) _PyUnicode_DATA(_PyObject_CAST(op))
/* Return pointers to the canonical representation cast to unsigned char,
Py_UCS2, or Py_UCS4 for direct character access.

View file

@ -0,0 +1,3 @@
Implement :c:func:`PyUnicode_KIND` and :c:func:`PyUnicode_DATA` as function,
in addition to the macros with the same names. The macros rely on C bit
fields which have compiler-specific layout. Patch by Victor Stinner.

View file

@ -16486,3 +16486,24 @@ PyInit__string(void)
{
return PyModuleDef_Init(&_string_module);
}
#undef PyUnicode_KIND
int PyUnicode_KIND(PyObject *op)
{
if (!PyUnicode_Check(op)) {
PyErr_Format(PyExc_TypeError, "expect str, got %T", op);
return -1;
}
return _PyASCIIObject_CAST(op)->state.kind;
}
#undef PyUnicode_DATA
void* PyUnicode_DATA(PyObject *op)
{
if (!PyUnicode_Check(op)) {
PyErr_Format(PyExc_TypeError, "expect str, got %T", op);
return NULL;
}
return _PyUnicode_DATA(op);
}