Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f5d72f3

Browse files
committed
Simply deque repeat by reusing code in in-line repeat. Avoid unnecessary division.
1 parent 87e8fe6 commit f5d72f3

1 file changed

Lines changed: 18 additions & 30 deletions

File tree

Modules/_collectionsmodule.c

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -538,32 +538,6 @@ deque_concat(dequeobject *deque, PyObject *other)
538538

539539
static void deque_clear(dequeobject *deque);
540540

541-
static PyObject *
542-
deque_repeat(dequeobject *deque, Py_ssize_t n)
543-
{
544-
dequeobject *new_deque;
545-
PyObject *result;
546-
547-
/* XXX add a special case for when maxlen is defined */
548-
if (n < 0)
549-
n = 0;
550-
else if (n > 0 && Py_SIZE(deque) > MAX_DEQUE_LEN / n)
551-
return PyErr_NoMemory();
552-
553-
new_deque = (dequeobject *)deque_new(&deque_type, (PyObject *)NULL, (PyObject *)NULL);
554-
new_deque->maxlen = deque->maxlen;
555-
556-
for ( ; n ; n--) {
557-
result = deque_extend(new_deque, (PyObject *)deque);
558-
if (result == NULL) {
559-
Py_DECREF(new_deque);
560-
return NULL;
561-
}
562-
Py_DECREF(result);
563-
}
564-
return (PyObject *)new_deque;
565-
}
566-
567541
static PyObject *
568542
deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
569543
{
@@ -583,17 +557,16 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
583557
return (PyObject *)deque;
584558
}
585559

586-
if (size > MAX_DEQUE_LEN / n) {
587-
return PyErr_NoMemory();
588-
}
589-
590560
if (size == 1) {
591561
/* common case, repeating a single element */
592562
PyObject *item = deque->leftblock->data[deque->leftindex];
593563

594564
if (deque->maxlen != -1 && n > deque->maxlen)
595565
n = deque->maxlen;
596566

567+
if (n > MAX_DEQUE_LEN)
568+
return PyErr_NoMemory();
569+
597570
for (i = 0 ; i < n-1 ; i++) {
598571
rv = deque_append(deque, item);
599572
if (rv == NULL)
@@ -604,6 +577,10 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
604577
return (PyObject *)deque;
605578
}
606579

580+
if ((size_t)size > MAX_DEQUE_LEN / (size_t)n) {
581+
return PyErr_NoMemory();
582+
}
583+
607584
seq = PySequence_List((PyObject *)deque);
608585
if (seq == NULL)
609586
return seq;
@@ -621,6 +598,17 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
621598
return (PyObject *)deque;
622599
}
623600

601+
static PyObject *
602+
deque_repeat(dequeobject *deque, Py_ssize_t n)
603+
{
604+
dequeobject *new_deque;
605+
606+
new_deque = (dequeobject *)deque_copy((PyObject *) deque);
607+
if (new_deque == NULL)
608+
return NULL;
609+
return deque_inplace_repeat(new_deque, n);
610+
}
611+
624612
/* The rotate() method is part of the public API and is used internally
625613
as a primitive for other methods.
626614

0 commit comments

Comments
 (0)