summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/collections.rst3
-rw-r--r--Lib/test/test_deque.py14
-rw-r--r--Misc/NEWS4
-rw-r--r--Modules/_collectionsmodule.c7
4 files changed, 28 insertions, 0 deletions
diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst
index 00d2916..e89da35 100644
--- a/Doc/library/collections.rst
+++ b/Doc/library/collections.rst
@@ -477,6 +477,9 @@ or subtracting from an empty counter.
Insert *x* into the deque at position *i*.
+ If the insertion causes a bounded deque to grow beyond *maxlen*, the
+ rightmost element is then removed to restore the size limit.
+
.. versionadded:: 3.5
diff --git a/Lib/test/test_deque.py b/Lib/test/test_deque.py
index 8718716..d2a4633 100644
--- a/Lib/test/test_deque.py
+++ b/Lib/test/test_deque.py
@@ -304,6 +304,20 @@ class TestBasic(unittest.TestCase):
s.insert(i, 'Z')
self.assertEqual(list(d), s)
+ def test_index_bug_26194(self):
+ data = 'ABC'
+ for i in range(len(data) + 1):
+ d = deque(data, len(data))
+ d.insert(i, None)
+ s = list(data)
+ s.insert(i, None)
+ s.pop()
+ self.assertEqual(list(d), s)
+ if i < len(data):
+ self.assertIsNone(d[i])
+ else:
+ self.assertTrue(None not in d)
+
def test_imul(self):
for n in (-10, -1, 0, 1, 2, 10, 1000):
d = deque()
diff --git a/Misc/NEWS b/Misc/NEWS
index 75df532..5e461f9 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -17,6 +17,10 @@ Core and Builtins
Python 3.5.1 to hide the exact implementation of atomic C types, to avoid
compiler issues.
+- Issue #26194: Deque.insert() gave odd results for bounded deques that had
+ reached their maximum size. Now, the insert will happen normally and then
+ any overflowing element will be truncated from the right side.
+
- Issue #25843: When compiling code, don't merge constants if they are equal
but have a different types. For example, ``f1, f2 = lambda: 1, lambda: 1.0``
is now correctly compiled to two different functions: ``f1()`` returns ``1``
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
index 1a33428..b9c4f3b 100644
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -973,10 +973,17 @@ deque_insert(dequeobject *deque, PyObject *args)
Py_ssize_t index;
Py_ssize_t n = Py_SIZE(deque);
PyObject *value;
+ PyObject *oldvalue;
PyObject *rv;
if (!PyArg_ParseTuple(args, "nO:insert", &index, &value))
return NULL;
+ if (deque->maxlen == Py_SIZE(deque)) {
+ if (index >= deque->maxlen || Py_SIZE(deque) == 0)
+ Py_RETURN_NONE;
+ oldvalue = deque_pop(deque, NULL);
+ Py_DECREF(oldvalue);
+ }
if (index >= n)
return deque_append(deque, value);
if (index <= -n || index == 0)