From 466060c6357f921237bf37f5802fe083d3eb7a55 Mon Sep 17 00:00:00 2001 From: dnwpark Date: Sat, 1 Aug 2026 23:34:23 -0700 Subject: [PATCH] Inline tuple ops. --- mypyc/lib-rt/CPy.h | 41 ++++++++++++++++++++++++++++++++++++---- mypyc/lib-rt/tuple_ops.c | 40 --------------------------------------- 2 files changed, 37 insertions(+), 44 deletions(-) diff --git a/mypyc/lib-rt/CPy.h b/mypyc/lib-rt/CPy.h index 458db90efd530..f7e88c9db1ad1 100644 --- a/mypyc/lib-rt/CPy.h +++ b/mypyc/lib-rt/CPy.h @@ -862,11 +862,44 @@ bool CPySet_Remove(PyObject *set, PyObject *key); // Tuple operations - -PyObject *CPySequenceTuple_GetItem(PyObject *tuple, CPyTagged index); PyObject *CPySequenceTuple_GetSlice(PyObject *obj, CPyTagged start, CPyTagged end); -PyObject *CPySequenceTuple_GetItemUnsafe(PyObject *tuple, Py_ssize_t index); -void CPySequenceTuple_SetItemUnsafe(PyObject *tuple, Py_ssize_t index, PyObject *value); + +static inline bool CPySequenceTuple_IsValidIndex(Py_ssize_t n, Py_ssize_t size) { + return (0 <= n && n < size) || (-size <= n && n < 0); +} + +static inline PyObject *CPySequenceTuple_GetItem(PyObject *tuple, CPyTagged index) +{ + if (likely(CPyTagged_CheckShort(index))) { + Py_ssize_t n = CPyTagged_ShortAsSsize_t(index); + Py_ssize_t size = PyTuple_GET_SIZE(tuple); + if (unlikely(!CPySequenceTuple_IsValidIndex(n, size))) + { + PyErr_SetString(PyExc_IndexError, "tuple index out of range"); + return NULL; + } + if (n < 0) + n += size; + PyObject *result = PyTuple_GET_ITEM(tuple, n); + Py_INCREF(result); + return result; + } else { + PyErr_SetString(PyExc_OverflowError, CPYTHON_LARGE_INT_ERRMSG); + return NULL; + } +} + +static inline PyObject *CPySequenceTuple_GetItemUnsafe(PyObject *tuple, Py_ssize_t index) +{ + PyObject *result = PyTuple_GET_ITEM(tuple, index); + Py_INCREF(result); + return result; +} + +static inline void CPySequenceTuple_SetItemUnsafe(PyObject *tuple, Py_ssize_t index, PyObject *value) +{ + PyTuple_SET_ITEM(tuple, index, value); +} // Exception operations diff --git a/mypyc/lib-rt/tuple_ops.c b/mypyc/lib-rt/tuple_ops.c index 1df73f1907e2f..c5749f6fe7e0a 100644 --- a/mypyc/lib-rt/tuple_ops.c +++ b/mypyc/lib-rt/tuple_ops.c @@ -5,31 +5,6 @@ #include #include "CPy.h" -PyObject *CPySequenceTuple_GetItem(PyObject *tuple, CPyTagged index) { - if (CPyTagged_CheckShort(index)) { - Py_ssize_t n = CPyTagged_ShortAsSsize_t(index); - Py_ssize_t size = PyTuple_GET_SIZE(tuple); - if (n >= 0) { - if (n >= size) { - PyErr_SetString(PyExc_IndexError, "tuple index out of range"); - return NULL; - } - } else { - n += size; - if (n < 0) { - PyErr_SetString(PyExc_IndexError, "tuple index out of range"); - return NULL; - } - } - PyObject *result = PyTuple_GET_ITEM(tuple, n); - Py_INCREF(result); - return result; - } else { - PyErr_SetString(PyExc_OverflowError, CPYTHON_LARGE_INT_ERRMSG); - return NULL; - } -} - PyObject *CPySequenceTuple_GetSlice(PyObject *obj, CPyTagged start, CPyTagged end) { if (likely(PyTuple_CheckExact(obj) && CPyTagged_CheckShort(start) && CPyTagged_CheckShort(end))) { @@ -45,18 +20,3 @@ PyObject *CPySequenceTuple_GetSlice(PyObject *obj, CPyTagged start, CPyTagged en } return CPyObject_GetSlice(obj, start, end); } - -// No error checking -PyObject *CPySequenceTuple_GetItemUnsafe(PyObject *tuple, Py_ssize_t index) -{ - PyObject *result = PyTuple_GET_ITEM(tuple, index); - Py_INCREF(result); - return result; -} - -// PyTuple_SET_ITEM does no error checking, -// and should only be used to fill in brand new tuples. -void CPySequenceTuple_SetItemUnsafe(PyObject *tuple, Py_ssize_t index, PyObject *value) -{ - PyTuple_SET_ITEM(tuple, index, value); -}