static void deque_clear(dequeobject *deque);
-static PyObject *
-deque_repeat(dequeobject *deque, Py_ssize_t n)
-{
- dequeobject *new_deque;
- PyObject *result;
-
- /* XXX add a special case for when maxlen is defined */
- if (n < 0)
- n = 0;
- else if (n > 0 && Py_SIZE(deque) > MAX_DEQUE_LEN / n)
- return PyErr_NoMemory();
-
- new_deque = (dequeobject *)deque_new(&deque_type, (PyObject *)NULL, (PyObject *)NULL);
- new_deque->maxlen = deque->maxlen;
-
- for ( ; n ; n--) {
- result = deque_extend(new_deque, (PyObject *)deque);
- if (result == NULL) {
- Py_DECREF(new_deque);
- return NULL;
- }
- Py_DECREF(result);
- }
- return (PyObject *)new_deque;
-}
-
static PyObject *
deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
{
return (PyObject *)deque;
}
- if (size > MAX_DEQUE_LEN / n) {
- return PyErr_NoMemory();
- }
-
if (size == 1) {
/* common case, repeating a single element */
PyObject *item = deque->leftblock->data[deque->leftindex];
if (deque->maxlen != -1 && n > deque->maxlen)
n = deque->maxlen;
+ if (n > MAX_DEQUE_LEN)
+ return PyErr_NoMemory();
+
for (i = 0 ; i < n-1 ; i++) {
rv = deque_append(deque, item);
if (rv == NULL)
return (PyObject *)deque;
}
+ if ((size_t)size > MAX_DEQUE_LEN / (size_t)n) {
+ return PyErr_NoMemory();
+ }
+
seq = PySequence_List((PyObject *)deque);
if (seq == NULL)
return seq;
return (PyObject *)deque;
}
+static PyObject *
+deque_repeat(dequeobject *deque, Py_ssize_t n)
+{
+ dequeobject *new_deque;
+
+ new_deque = (dequeobject *)deque_copy((PyObject *) deque);
+ if (new_deque == NULL)
+ return NULL;
+ return deque_inplace_repeat(new_deque, n);
+}
+
/* The rotate() method is part of the public API and is used internally
as a primitive for other methods.