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
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.
--- /dev/null
+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.
{
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);
+}