summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2022-04-21 21:07:13 (GMT)
committerGitHub <noreply@github.com>2022-04-21 21:07:13 (GMT)
commit636ad7b47e5e1997b6e6979342fe11ae284fc1c7 (patch)
treee2443954dbaa74466cafa8bdeee97002b3c7f42f
parent364ed9409269fb321dc4eafdea677c09a4bc0d8d (diff)
downloadcpython-636ad7b47e5e1997b6e6979342fe11ae284fc1c7.zip
cpython-636ad7b47e5e1997b6e6979342fe11ae284fc1c7.tar.gz
cpython-636ad7b47e5e1997b6e6979342fe11ae284fc1c7.tar.bz2
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*".
-rw-r--r--Include/cpython/unicodeobject.h62
1 files changed, 44 insertions, 18 deletions
diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h
index 0897e66..8cc9885 100644
--- a/Include/cpython/unicodeobject.h
+++ b/Include/cpython/unicodeobject.h
@@ -590,10 +590,14 @@ Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize(
/* Fast access macros */
Py_DEPRECATED(3.3)
-static inline Py_ssize_t PyUnicode_WSTR_LENGTH(PyObject *op) {
- return PyUnicode_IS_COMPACT_ASCII(op) ?
- _PyASCIIObject_CAST(op)->length :
- _PyCompactUnicodeObject_CAST(op)->wstr_length;
+static inline Py_ssize_t PyUnicode_WSTR_LENGTH(PyObject *op)
+{
+ if (PyUnicode_IS_COMPACT_ASCII(op)) {
+ return _PyASCIIObject_CAST(op)->length;
+ }
+ else {
+ return _PyCompactUnicodeObject_CAST(op)->wstr_length;
+ }
}
#define PyUnicode_WSTR_LENGTH(op) PyUnicode_WSTR_LENGTH(_PyObject_CAST(op))
@@ -603,16 +607,25 @@ static inline Py_ssize_t PyUnicode_WSTR_LENGTH(PyObject *op) {
on request. Use PyUnicode_GET_LENGTH() for the length in code points. */
/* Py_DEPRECATED(3.3) */
-#define PyUnicode_GET_SIZE(op) \
- (_PyASCIIObject_CAST(op)->wstr ? \
- PyUnicode_WSTR_LENGTH(op) : \
- ((void)PyUnicode_AsUnicode(_PyObject_CAST(op)),\
- assert(_PyASCIIObject_CAST(op)->wstr), \
- PyUnicode_WSTR_LENGTH(op)))
+static inline Py_ssize_t PyUnicode_GET_SIZE(PyObject *op)
+{
+ _Py_COMP_DIAG_PUSH
+ _Py_COMP_DIAG_IGNORE_DEPR_DECLS
+ if (_PyASCIIObject_CAST(op)->wstr == NULL) {
+ (void)PyUnicode_AsUnicode(op);
+ assert(_PyASCIIObject_CAST(op)->wstr != NULL);
+ }
+ return PyUnicode_WSTR_LENGTH(op);
+ _Py_COMP_DIAG_POP
+}
+#define PyUnicode_GET_SIZE(op) PyUnicode_GET_SIZE(_PyObject_CAST(op))
-/* Py_DEPRECATED(3.3) */
-#define PyUnicode_GET_DATA_SIZE(op) \
- (PyUnicode_GET_SIZE(op) * Py_UNICODE_SIZE)
+ /* Py_DEPRECATED(3.3) */
+ static inline Py_ssize_t PyUnicode_GET_DATA_SIZE(PyObject *op)
+{
+ return PyUnicode_GET_SIZE(op) * Py_UNICODE_SIZE;
+}
+#define PyUnicode_GET_DATA_SIZE(op) PyUnicode_GET_DATA_SIZE(_PyObject_CAST(op))
/* Alias for PyUnicode_AsUnicode(). This will create a wchar_t/Py_UNICODE
representation on demand. Using this macro is very inefficient now,
@@ -620,13 +633,26 @@ static inline Py_ssize_t PyUnicode_WSTR_LENGTH(PyObject *op) {
use PyUnicode_WRITE() and PyUnicode_READ(). */
/* Py_DEPRECATED(3.3) */
-#define PyUnicode_AS_UNICODE(op) \
- (_PyASCIIObject_CAST(op)->wstr ? _PyASCIIObject_CAST(op)->wstr : \
- PyUnicode_AsUnicode(_PyObject_CAST(op)))
+static inline Py_UNICODE* PyUnicode_AS_UNICODE(PyObject *op)
+{
+ wchar_t *wstr = _PyASCIIObject_CAST(op)->wstr;
+ if (wstr != NULL) {
+ return wstr;
+ }
+
+ _Py_COMP_DIAG_PUSH
+ _Py_COMP_DIAG_IGNORE_DEPR_DECLS
+ return PyUnicode_AsUnicode(op);
+ _Py_COMP_DIAG_POP
+}
+#define PyUnicode_AS_UNICODE(op) PyUnicode_AS_UNICODE(_PyObject_CAST(op))
/* Py_DEPRECATED(3.3) */
-#define PyUnicode_AS_DATA(op) \
- ((const char *)(PyUnicode_AS_UNICODE(op)))
+static inline const char* PyUnicode_AS_DATA(PyObject *op)
+{
+ return (const char *)PyUnicode_AS_UNICODE(op);
+}
+#define PyUnicode_AS_DATA(op) PyUnicode_AS_DATA(_PyObject_CAST(op))
/* --- _PyUnicodeWriter API ----------------------------------------------- */