mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
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:
parent
e1c4ba9288
commit
a810cb89f1
3 changed files with 30 additions and 2 deletions
|
@ -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.
|
||||
|
|
|
@ -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.
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue