]> granicus.if.org Git - python/commitdiff
Simply deque repeat by reusing code in in-line repeat. Avoid unnecessary division.
authorRaymond Hettinger <python@rcn.com>
Thu, 10 Sep 2015 02:39:44 +0000 (22:39 -0400)
committerRaymond Hettinger <python@rcn.com>
Thu, 10 Sep 2015 02:39:44 +0000 (22:39 -0400)
Modules/_collectionsmodule.c

index ea3e88fa9afd391b0506ca9a304084e3ca808026..db27e923e9ec494b569b6d574233eb95e9772317 100644 (file)
@@ -538,32 +538,6 @@ deque_concat(dequeobject *deque, PyObject *other)
 
 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)
 {
@@ -583,10 +557,6 @@ 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];
@@ -594,6 +564,9 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
         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)
@@ -604,6 +577,10 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
         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;
@@ -621,6 +598,17 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
     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.