#include "Python.h"
#include "pycore_abstract.h" // _PyIndex_Check()
#include "pycore_bytes_methods.h" // _Py_bytes_startswith()
-#include "pycore_bytesobject.h" // _PyBytes_Find(), _PyBytes_Repeat()
+#include "pycore_bytesobject.h" // _PyBytes_Find(), _PyBytes_RepeatBuffer()
#include "pycore_call.h" // _PyObject_CallNoArgs()
#include "pycore_ceval.h" // _PyEval_GetBuiltin()
#include "pycore_format.h" // F_LJUST
return result;
}
-static PyObject *
-bytes_repeat(PyObject *self, Py_ssize_t n)
+PyObject *
+_PyBytes_Repeat(PyObject *self, Py_ssize_t n)
{
PyBytesObject *a = _PyBytes_CAST(self);
if (n < 0)
set_ob_shash(op, -1);
op->ob_sval[size] = '\0';
- _PyBytes_Repeat(op->ob_sval, size, a->ob_sval, Py_SIZE(a));
+ _PyBytes_RepeatBuffer(op->ob_sval, size, a->ob_sval, Py_SIZE(a));
return (PyObject *) op;
}
static PySequenceMethods bytes_as_sequence = {
bytes_length, /*sq_length*/
_PyBytes_Concat, /*sq_concat*/
- bytes_repeat, /*sq_repeat*/
+ _PyBytes_Repeat, /*sq_repeat*/
bytes_item, /*sq_item*/
0, /*sq_slice*/
0, /*sq_ass_item*/
void
-_PyBytes_Repeat(char* dest, Py_ssize_t len_dest,
+_PyBytes_RepeatBuffer(char* dest, Py_ssize_t len_dest,
const char* src, Py_ssize_t len_src)
{
if (len_dest == 0) {
#include "Python.h"
#include "pycore_abstract.h" // _PyIndex_Check()
#include "pycore_bytes_methods.h" // _Py_bytes_lower()
-#include "pycore_bytesobject.h" // _PyBytes_Repeat()
+#include "pycore_bytesobject.h" // _PyBytes_RepeatBuffer()
#include "pycore_ceval.h" // _PyEval_GetBuiltin()
#include "pycore_codecs.h" // _PyCodec_Lookup()
#include "pycore_critical_section.h" // Py_*_CRITICAL_SECTION_SEQUENCE_FAST
}
-static PyObject*
-unicode_repeat(PyObject *str, Py_ssize_t len)
+PyObject *
+_PyUnicode_Repeat(PyObject *str, Py_ssize_t len)
{
PyObject *u;
Py_ssize_t nchars, n;
else {
Py_ssize_t char_size = PyUnicode_KIND(str);
char *to = (char *) PyUnicode_DATA(u);
- _PyBytes_Repeat(to, nchars * char_size, PyUnicode_DATA(str),
+ _PyBytes_RepeatBuffer(to, nchars * char_size, PyUnicode_DATA(str),
PyUnicode_GET_LENGTH(str) * char_size);
}
static PySequenceMethods unicode_as_sequence = {
unicode_length, /* sq_length */
PyUnicode_Concat, /* sq_concat */
- unicode_repeat, /* sq_repeat */
+ _PyUnicode_Repeat, /* sq_repeat */
unicode_getitem, /* sq_item */
0, /* sq_slice */
0, /* sq_ass_item */
_PyLong_IsCompact((PyLongObject *)v);
}
-/* sequence * int helpers: bypass PyNumber_Multiply dispatch overhead
- by calling sq_repeat directly with PyLong_AsSsize_t. */
-
-static inline PyObject *
-seq_int_multiply(PyObject *seq, PyObject *n,
- ssizeargfunc repeat)
-{
- Py_ssize_t count = PyLong_AsSsize_t(n);
- if (count == -1 && PyErr_Occurred()) {
- return NULL;
- }
- return repeat(seq, count);
-}
-
-static PyObject *
-str_int_multiply(PyObject *lhs, PyObject *rhs)
-{
- return seq_int_multiply(lhs, rhs, PyUnicode_Type.tp_as_sequence->sq_repeat);
-}
-
-static PyObject *
-int_str_multiply(PyObject *lhs, PyObject *rhs)
-{
- return seq_int_multiply(rhs, lhs, PyUnicode_Type.tp_as_sequence->sq_repeat);
-}
-
-static PyObject *
-bytes_int_multiply(PyObject *lhs, PyObject *rhs)
-{
- return seq_int_multiply(lhs, rhs, PyBytes_Type.tp_as_sequence->sq_repeat);
-}
-
-static PyObject *
-int_bytes_multiply(PyObject *lhs, PyObject *rhs)
-{
- return seq_int_multiply(rhs, lhs, PyBytes_Type.tp_as_sequence->sq_repeat);
-}
-
-static PyObject *
-tuple_int_multiply(PyObject *lhs, PyObject *rhs)
-{
- return seq_int_multiply(lhs, rhs, PyTuple_Type.tp_as_sequence->sq_repeat);
-}
-
-static PyObject *
-int_tuple_multiply(PyObject *lhs, PyObject *rhs)
-{
- return seq_int_multiply(rhs, lhs, PyTuple_Type.tp_as_sequence->sq_repeat);
-}
+#define SEQ_INT_MULTIPLY_ACTION(NAME, REPEAT, SEQ, COUNT) \
+ static PyObject * \
+ (NAME)(PyObject *lhs, PyObject *rhs) \
+ { \
+ Py_ssize_t count = PyLong_AsSsize_t(COUNT); \
+ if (count == -1 && PyErr_Occurred()) { \
+ return NULL; \
+ } \
+ return REPEAT(SEQ, count); \
+ }
+SEQ_INT_MULTIPLY_ACTION(str_int_multiply, _PyUnicode_Repeat, lhs, rhs)
+SEQ_INT_MULTIPLY_ACTION(int_str_multiply, _PyUnicode_Repeat, rhs, lhs)
+SEQ_INT_MULTIPLY_ACTION(bytes_int_multiply, _PyBytes_Repeat, lhs, rhs)
+SEQ_INT_MULTIPLY_ACTION(int_bytes_multiply, _PyBytes_Repeat, rhs, lhs)
+SEQ_INT_MULTIPLY_ACTION(tuple_int_multiply, _PyTuple_Repeat, lhs, rhs)
+SEQ_INT_MULTIPLY_ACTION(int_tuple_multiply, _PyTuple_Repeat, rhs, lhs)
+#undef SEQ_INT_MULTIPLY_ACTION
static int
compactlongs_guard(PyObject *lhs, PyObject *rhs)
to be a freshly allocated object. */
{NB_ADD, NULL, _PyTuple_Concat, &PyTuple_Type, 0, &PyTuple_Type, &PyTuple_Type},
- /* str * int / int * str: call unicode_repeat directly.
- unicode_repeat returns the original when n == 1. */
+ /* str * int / int * str: call _PyUnicode_Repeat directly.
+ _PyUnicode_Repeat returns the original when n == 1. */
{NB_MULTIPLY, NULL, str_int_multiply, &PyUnicode_Type, 0, &PyUnicode_Type, &PyLong_Type},
{NB_MULTIPLY, NULL, int_str_multiply, &PyUnicode_Type, 0, &PyLong_Type, &PyUnicode_Type},
{NB_INPLACE_MULTIPLY, NULL, str_int_multiply, &PyUnicode_Type, 0, &PyUnicode_Type, &PyLong_Type},
{NB_ADD, NULL, _PyBytes_Concat, &PyBytes_Type, 0, &PyBytes_Type, &PyBytes_Type},
{NB_INPLACE_ADD, NULL, _PyBytes_Concat, &PyBytes_Type, 0, &PyBytes_Type, &PyBytes_Type},
- /* bytes * int / int * bytes: call bytes_repeat directly.
- bytes_repeat returns the original when n == 1. */
+ /* bytes * int / int * bytes: call _PyBytes_Repeat directly.
+ _PyBytes_Repeat returns the original when n == 1. */
{NB_MULTIPLY, NULL, bytes_int_multiply, &PyBytes_Type, 0, &PyBytes_Type, &PyLong_Type},
{NB_MULTIPLY, NULL, int_bytes_multiply, &PyBytes_Type, 0, &PyLong_Type, &PyBytes_Type},
{NB_INPLACE_MULTIPLY, NULL, bytes_int_multiply, &PyBytes_Type, 0, &PyBytes_Type, &PyLong_Type},
{NB_INPLACE_MULTIPLY, NULL, int_bytes_multiply, &PyBytes_Type, 0, &PyLong_Type, &PyBytes_Type},
- /* tuple * int / int * tuple: call tuple_repeat directly.
- tuple_repeat returns the original when n == 1. */
+ /* tuple * int / int * tuple: call _PyTuple_Repeat directly.
+ _PyTuple_Repeat returns the original when n == 1. */
{NB_MULTIPLY, NULL, tuple_int_multiply, &PyTuple_Type, 0, &PyTuple_Type, &PyLong_Type},
{NB_MULTIPLY, NULL, int_tuple_multiply, &PyTuple_Type, 0, &PyLong_Type, &PyTuple_Type},
{NB_INPLACE_MULTIPLY, NULL, tuple_int_multiply, &PyTuple_Type, 0, &PyTuple_Type, &PyLong_Type},