@@ -2124,55 +2124,23 @@ is_compactlong(PyObject *v)
21242124 _PyLong_IsCompact ((PyLongObject * )v );
21252125}
21262126
2127- /* sequence * int helpers: bypass PyNumber_Multiply dispatch overhead
2128- by calling sq_repeat directly with PyLong_AsSsize_t. */
2129-
2130- static inline PyObject *
2131- seq_int_multiply (PyObject * seq , PyObject * n ,
2132- ssizeargfunc repeat )
2133- {
2134- Py_ssize_t count = PyLong_AsSsize_t (n );
2135- if (count == -1 && PyErr_Occurred ()) {
2136- return NULL ;
2137- }
2138- return repeat (seq , count );
2139- }
2140-
2141- static PyObject *
2142- str_int_multiply (PyObject * lhs , PyObject * rhs )
2143- {
2144- return seq_int_multiply (lhs , rhs , PyUnicode_Type .tp_as_sequence -> sq_repeat );
2145- }
2146-
2147- static PyObject *
2148- int_str_multiply (PyObject * lhs , PyObject * rhs )
2149- {
2150- return seq_int_multiply (rhs , lhs , PyUnicode_Type .tp_as_sequence -> sq_repeat );
2151- }
2152-
2153- static PyObject *
2154- bytes_int_multiply (PyObject * lhs , PyObject * rhs )
2155- {
2156- return seq_int_multiply (lhs , rhs , PyBytes_Type .tp_as_sequence -> sq_repeat );
2157- }
2158-
2159- static PyObject *
2160- int_bytes_multiply (PyObject * lhs , PyObject * rhs )
2161- {
2162- return seq_int_multiply (rhs , lhs , PyBytes_Type .tp_as_sequence -> sq_repeat );
2163- }
2164-
2165- static PyObject *
2166- tuple_int_multiply (PyObject * lhs , PyObject * rhs )
2167- {
2168- return seq_int_multiply (lhs , rhs , PyTuple_Type .tp_as_sequence -> sq_repeat );
2169- }
2170-
2171- static PyObject *
2172- int_tuple_multiply (PyObject * lhs , PyObject * rhs )
2173- {
2174- return seq_int_multiply (rhs , lhs , PyTuple_Type .tp_as_sequence -> sq_repeat );
2175- }
2127+ #define SEQ_INT_MULTIPLY_ACTION (NAME , REPEAT , SEQ , COUNT ) \
2128+ static PyObject * \
2129+ (NAME)(PyObject *lhs, PyObject *rhs) \
2130+ { \
2131+ Py_ssize_t count = PyLong_AsSsize_t(COUNT); \
2132+ if (count == -1 && PyErr_Occurred()) { \
2133+ return NULL; \
2134+ } \
2135+ return REPEAT(SEQ, count); \
2136+ }
2137+ SEQ_INT_MULTIPLY_ACTION (str_int_multiply , _PyUnicode_Repeat , lhs , rhs )
2138+ SEQ_INT_MULTIPLY_ACTION (int_str_multiply , _PyUnicode_Repeat , rhs , lhs )
2139+ SEQ_INT_MULTIPLY_ACTION (bytes_int_multiply , _PyBytes_Repeat , lhs , rhs )
2140+ SEQ_INT_MULTIPLY_ACTION (int_bytes_multiply , _PyBytes_Repeat , rhs , lhs )
2141+ SEQ_INT_MULTIPLY_ACTION (tuple_int_multiply , _PyTuple_Repeat , lhs , rhs )
2142+ SEQ_INT_MULTIPLY_ACTION (int_tuple_multiply , _PyTuple_Repeat , rhs , lhs )
2143+ #undef SEQ_INT_MULTIPLY_ACTION
21762144
21772145static int
21782146compactlongs_guard (PyObject * lhs , PyObject * rhs )
@@ -2300,8 +2268,8 @@ static _PyBinaryOpSpecializationDescr binaryop_extend_descrs[] = {
23002268 to be a freshly allocated object. */
23012269 {NB_ADD , NULL , _PyTuple_Concat , & PyTuple_Type , 0 , & PyTuple_Type , & PyTuple_Type },
23022270
2303- /* str * int / int * str: call unicode_repeat directly.
2304- unicode_repeat returns the original when n == 1. */
2271+ /* str * int / int * str: call _PyUnicode_Repeat directly.
2272+ _PyUnicode_Repeat returns the original when n == 1. */
23052273 {NB_MULTIPLY , NULL , str_int_multiply , & PyUnicode_Type , 0 , & PyUnicode_Type , & PyLong_Type },
23062274 {NB_MULTIPLY , NULL , int_str_multiply , & PyUnicode_Type , 0 , & PyLong_Type , & PyUnicode_Type },
23072275 {NB_INPLACE_MULTIPLY , NULL , str_int_multiply , & PyUnicode_Type , 0 , & PyUnicode_Type , & PyLong_Type },
@@ -2312,15 +2280,15 @@ static _PyBinaryOpSpecializationDescr binaryop_extend_descrs[] = {
23122280 {NB_ADD , NULL , _PyBytes_Concat , & PyBytes_Type , 0 , & PyBytes_Type , & PyBytes_Type },
23132281 {NB_INPLACE_ADD , NULL , _PyBytes_Concat , & PyBytes_Type , 0 , & PyBytes_Type , & PyBytes_Type },
23142282
2315- /* bytes * int / int * bytes: call bytes_repeat directly.
2316- bytes_repeat returns the original when n == 1. */
2283+ /* bytes * int / int * bytes: call _PyBytes_Repeat directly.
2284+ _PyBytes_Repeat returns the original when n == 1. */
23172285 {NB_MULTIPLY , NULL , bytes_int_multiply , & PyBytes_Type , 0 , & PyBytes_Type , & PyLong_Type },
23182286 {NB_MULTIPLY , NULL , int_bytes_multiply , & PyBytes_Type , 0 , & PyLong_Type , & PyBytes_Type },
23192287 {NB_INPLACE_MULTIPLY , NULL , bytes_int_multiply , & PyBytes_Type , 0 , & PyBytes_Type , & PyLong_Type },
23202288 {NB_INPLACE_MULTIPLY , NULL , int_bytes_multiply , & PyBytes_Type , 0 , & PyLong_Type , & PyBytes_Type },
23212289
2322- /* tuple * int / int * tuple: call tuple_repeat directly.
2323- tuple_repeat returns the original when n == 1. */
2290+ /* tuple * int / int * tuple: call _PyTuple_Repeat directly.
2291+ _PyTuple_Repeat returns the original when n == 1. */
23242292 {NB_MULTIPLY , NULL , tuple_int_multiply , & PyTuple_Type , 0 , & PyTuple_Type , & PyLong_Type },
23252293 {NB_MULTIPLY , NULL , int_tuple_multiply , & PyTuple_Type , 0 , & PyLong_Type , & PyTuple_Type },
23262294 {NB_INPLACE_MULTIPLY , NULL , tuple_int_multiply , & PyTuple_Type , 0 , & PyTuple_Type , & PyLong_Type },
0 commit comments