Skip to content

Commit 636ad7b

Browse files
authored
gh-89653: PEP 670: Convert unicodeobject.h macros to functions (#91799)
Convert unicodeobject.h macros to static inline functions: * PyUnicode_AS_DATA() * PyUnicode_AS_UNICODE() * PyUnicode_GET_DATA_SIZE() * PyUnicode_GET_SIZE() Static inline functions are wrapped by macros which casts arguments with _PyObject_CAST() to prevent introducing new compiler warnings when passing "const PyObject*".
1 parent 364ed94 commit 636ad7b

File tree

1 file changed

+44
-18
lines changed

1 file changed

+44
-18
lines changed

Include/cpython/unicodeobject.h

+44-18
Original file line numberDiff line numberDiff line change
@@ -590,10 +590,14 @@ Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize(
590590
/* Fast access macros */
591591

592592
Py_DEPRECATED(3.3)
593-
static inline Py_ssize_t PyUnicode_WSTR_LENGTH(PyObject *op) {
594-
return PyUnicode_IS_COMPACT_ASCII(op) ?
595-
_PyASCIIObject_CAST(op)->length :
596-
_PyCompactUnicodeObject_CAST(op)->wstr_length;
593+
static inline Py_ssize_t PyUnicode_WSTR_LENGTH(PyObject *op)
594+
{
595+
if (PyUnicode_IS_COMPACT_ASCII(op)) {
596+
return _PyASCIIObject_CAST(op)->length;
597+
}
598+
else {
599+
return _PyCompactUnicodeObject_CAST(op)->wstr_length;
600+
}
597601
}
598602
#define PyUnicode_WSTR_LENGTH(op) PyUnicode_WSTR_LENGTH(_PyObject_CAST(op))
599603

@@ -603,30 +607,52 @@ static inline Py_ssize_t PyUnicode_WSTR_LENGTH(PyObject *op) {
603607
on request. Use PyUnicode_GET_LENGTH() for the length in code points. */
604608

605609
/* Py_DEPRECATED(3.3) */
606-
#define PyUnicode_GET_SIZE(op) \
607-
(_PyASCIIObject_CAST(op)->wstr ? \
608-
PyUnicode_WSTR_LENGTH(op) : \
609-
((void)PyUnicode_AsUnicode(_PyObject_CAST(op)),\
610-
assert(_PyASCIIObject_CAST(op)->wstr), \
611-
PyUnicode_WSTR_LENGTH(op)))
610+
static inline Py_ssize_t PyUnicode_GET_SIZE(PyObject *op)
611+
{
612+
_Py_COMP_DIAG_PUSH
613+
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
614+
if (_PyASCIIObject_CAST(op)->wstr == NULL) {
615+
(void)PyUnicode_AsUnicode(op);
616+
assert(_PyASCIIObject_CAST(op)->wstr != NULL);
617+
}
618+
return PyUnicode_WSTR_LENGTH(op);
619+
_Py_COMP_DIAG_POP
620+
}
621+
#define PyUnicode_GET_SIZE(op) PyUnicode_GET_SIZE(_PyObject_CAST(op))
612622

613-
/* Py_DEPRECATED(3.3) */
614-
#define PyUnicode_GET_DATA_SIZE(op) \
615-
(PyUnicode_GET_SIZE(op) * Py_UNICODE_SIZE)
623+
/* Py_DEPRECATED(3.3) */
624+
static inline Py_ssize_t PyUnicode_GET_DATA_SIZE(PyObject *op)
625+
{
626+
return PyUnicode_GET_SIZE(op) * Py_UNICODE_SIZE;
627+
}
628+
#define PyUnicode_GET_DATA_SIZE(op) PyUnicode_GET_DATA_SIZE(_PyObject_CAST(op))
616629

617630
/* Alias for PyUnicode_AsUnicode(). This will create a wchar_t/Py_UNICODE
618631
representation on demand. Using this macro is very inefficient now,
619632
try to port your code to use the new PyUnicode_*BYTE_DATA() macros or
620633
use PyUnicode_WRITE() and PyUnicode_READ(). */
621634

622635
/* Py_DEPRECATED(3.3) */
623-
#define PyUnicode_AS_UNICODE(op) \
624-
(_PyASCIIObject_CAST(op)->wstr ? _PyASCIIObject_CAST(op)->wstr : \
625-
PyUnicode_AsUnicode(_PyObject_CAST(op)))
636+
static inline Py_UNICODE* PyUnicode_AS_UNICODE(PyObject *op)
637+
{
638+
wchar_t *wstr = _PyASCIIObject_CAST(op)->wstr;
639+
if (wstr != NULL) {
640+
return wstr;
641+
}
642+
643+
_Py_COMP_DIAG_PUSH
644+
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
645+
return PyUnicode_AsUnicode(op);
646+
_Py_COMP_DIAG_POP
647+
}
648+
#define PyUnicode_AS_UNICODE(op) PyUnicode_AS_UNICODE(_PyObject_CAST(op))
626649

627650
/* Py_DEPRECATED(3.3) */
628-
#define PyUnicode_AS_DATA(op) \
629-
((const char *)(PyUnicode_AS_UNICODE(op)))
651+
static inline const char* PyUnicode_AS_DATA(PyObject *op)
652+
{
653+
return (const char *)PyUnicode_AS_UNICODE(op);
654+
}
655+
#define PyUnicode_AS_DATA(op) PyUnicode_AS_DATA(_PyObject_CAST(op))
630656

631657

632658
/* --- _PyUnicodeWriter API ----------------------------------------------- */

0 commit comments

Comments
 (0)