[Python-checkins] gh-89653: PEP 670: Convert tuple macros to functions (#91786)

vstinner webhook-mailer at python.org
Thu Apr 21 10:53:08 EDT 2022


https://github.com/python/cpython/commit/2a5f171759a31597032cfe52646929e6f8727243
commit: 2a5f171759a31597032cfe52646929e6f8727243
branch: main
author: Victor Stinner <vstinner at python.org>
committer: vstinner <vstinner at python.org>
date: 2022-04-21T16:52:54+02:00
summary:

gh-89653: PEP 670: Convert tuple macros to functions (#91786)

Convert macros to static inline functions:

* PyTuple_GET_SIZE()
* PyTuple_SET_ITEM()
* PyList_GET_SIZE()
* PyList_SET_ITEM()

Add a macro converting arguments to PyTupleObject*, PyListObject* or
PyObject* to prevent emitting new compiler warnings.

According to PEP 670, PyTuple_GET_ITEM() and PyList_GET_ITEM() are
left as macros.

files:
M Include/cpython/listobject.h
M Include/cpython/tupleobject.h

diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h
index 51687d866ce97..0cd69216a4c4c 100644
--- a/Include/cpython/listobject.h
+++ b/Include/cpython/listobject.h
@@ -24,11 +24,21 @@ typedef struct {
 PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *);
 PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out);
 
-/* Macro, trading safety for speed */
-
 /* Cast argument to PyListObject* type. */
 #define _PyList_CAST(op) (assert(PyList_Check(op)), (PyListObject *)(op))
 
-#define PyList_GET_ITEM(op, i) (_PyList_CAST(op)->ob_item[i])
-#define PyList_SET_ITEM(op, i, v) _Py_RVALUE(_PyList_CAST(op)->ob_item[i] = (v))
-#define PyList_GET_SIZE(op)    Py_SIZE(_PyList_CAST(op))
+// Macros and static inline functions, trading safety for speed
+
+static inline Py_ssize_t PyList_GET_SIZE(PyListObject *op) {
+    return Py_SIZE(op);
+}
+#define PyList_GET_SIZE(op) PyList_GET_SIZE(_PyList_CAST(op))
+
+#define PyList_GET_ITEM(op, index) (_PyList_CAST(op)->ob_item[index])
+
+static inline void
+PyList_SET_ITEM(PyListObject *op, Py_ssize_t index, PyObject *value) {
+    op->ob_item[index] = value;
+}
+#define PyList_SET_ITEM(op, index, value) \
+    PyList_SET_ITEM(_PyList_CAST(op), index, _PyObject_CAST(value))
diff --git a/Include/cpython/tupleobject.h b/Include/cpython/tupleobject.h
index fc37c4e6de1ca..fd15ecd1c772f 100644
--- a/Include/cpython/tupleobject.h
+++ b/Include/cpython/tupleobject.h
@@ -13,16 +13,24 @@ typedef struct {
 PyAPI_FUNC(int) _PyTuple_Resize(PyObject **, Py_ssize_t);
 PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *);
 
-/* Macros trading safety for speed */
-
 /* Cast argument to PyTupleObject* type. */
 #define _PyTuple_CAST(op) (assert(PyTuple_Check(op)), (PyTupleObject *)(op))
 
-#define PyTuple_GET_SIZE(op)    Py_SIZE(_PyTuple_CAST(op))
+// Macros and static inline functions, trading safety for speed
+
+static inline Py_ssize_t PyTuple_GET_SIZE(PyTupleObject *op) {
+    return Py_SIZE(op);
+}
+#define PyTuple_GET_SIZE(op) PyTuple_GET_SIZE(_PyTuple_CAST(op))
 
-#define PyTuple_GET_ITEM(op, i) (_PyTuple_CAST(op)->ob_item[i])
+#define PyTuple_GET_ITEM(op, index) (_PyTuple_CAST(op)->ob_item[index])
 
-/* Macro, *only* to be used to fill in brand new tuples */
-#define PyTuple_SET_ITEM(op, i, v) _Py_RVALUE(_PyTuple_CAST(op)->ob_item[i] = (v))
+/* Function *only* to be used to fill in brand new tuples */
+static inline void
+PyTuple_SET_ITEM(PyTupleObject *op, Py_ssize_t index, PyObject *value) {
+    op->ob_item[index] = value;
+}
+#define PyTuple_SET_ITEM(op, index, value) \
+    PyTuple_SET_ITEM(_PyTuple_CAST(op), index, _PyObject_CAST(value))
 
 PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out);



More information about the Python-checkins mailing list