12#include "nuitka/prelude.h"
15static Py_ssize_t CONVERT_LONG_TO_REPEAT_FACTOR(PyObject *value) {
17 assert(PyLong_Check(value));
19 Py_ssize_t digits_count = Nuitka_LongGetDigitSize(value);
21 if (digits_count == 0) {
25 bool is_negative = Nuitka_LongIsNegative(value);
27 PyLongObject *long_value = (PyLongObject *)value;
29 digit *digits = Nuitka_LongGetDigitPointer(long_value);
31 if ((digits_count == 1) && (is_negative ==
false)) {
35 Py_ssize_t result = 0;
37 while (--digits_count >= 0) {
38 Py_ssize_t prev = result;
39 result = (result << PyLong_SHIFT) | digits[digits_count];
42 if ((result >> PyLong_SHIFT) != prev) {
43 return (Py_ssize_t)-1;
54static Py_ssize_t CONVERT_TO_REPEAT_FACTOR(PyObject *value) {
55#if PYTHON_VERSION < 0x300
56 assert(PyInt_Check(value) || PyLong_Check(value));
58 if (PyInt_Check(value)) {
59 Py_ssize_t result = PyInt_AS_LONG(value);
68 return CONVERT_LONG_TO_REPEAT_FACTOR(value);
74 assert(PyLong_Check(value));
76 return CONVERT_LONG_TO_REPEAT_FACTOR(value);
80static PyObject *SEQUENCE_REPEAT(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n) {
81 if (unlikely(!Nuitka_Index_Check(n))) {
82 PyErr_Format(PyExc_TypeError,
"can't multiply sequence by non-int of type '%s'", Py_TYPE(n)->tp_name);
87 PyObject *index_value = Nuitka_Number_Index(n);
89 if (unlikely(index_value == NULL)) {
93 Py_ssize_t count = CONVERT_TO_REPEAT_FACTOR(index_value);
95 Py_DECREF(index_value);
98 if (unlikely(count == -1)) {
99 PyErr_Format(PyExc_OverflowError,
"cannot fit '%s' into an index-sized integer", Py_TYPE(n)->tp_name);
103 PyObject *result = (*repeatfunc)(seq, count);
105 if (unlikely(result == NULL)) {