diff options
-rw-r--r-- | Doc/library/collections.rst | 3 | ||||
-rw-r--r-- | Lib/test/test_deque.py | 14 | ||||
-rw-r--r-- | Modules/_collectionsmodule.c | 7 |
3 files changed, 24 insertions, 0 deletions
diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index d3b025d..6a0c127 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 f75b3ff..34b1be2 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/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index b77ea65..69acc64 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1085,10 +1085,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) |