Issue #26194: Inserting into a full deque to raise an IndexError

This commit is contained in:
Raymond Hettinger 2016-02-01 21:19:22 -08:00
parent 3e7230904e
commit b00da57561
4 changed files with 18 additions and 20 deletions

View file

@ -477,8 +477,8 @@ or subtracting from an empty counter.
Insert *x* into the deque at position *i*. Insert *x* into the deque at position *i*.
If the insertion causes a bounded deque to grow beyond *maxlen*, the If the insertion would cause a bounded deque to grow beyond *maxlen*,
rightmost element is then removed to restore the size limit. an :exc:`IndexError` is raised.
.. versionadded:: 3.5 .. versionadded:: 3.5

View file

@ -304,19 +304,20 @@ class TestBasic(unittest.TestCase):
s.insert(i, 'Z') s.insert(i, 'Z')
self.assertEqual(list(d), s) self.assertEqual(list(d), s)
def test_index_bug_26194(self): def test_insert_bug_26194(self):
data = 'ABC' data = 'ABC'
for i in range(len(data) + 1): d = deque(data, maxlen=len(data))
d = deque(data, len(data)) with self.assertRaises(IndexError):
d.insert(i, None) d.insert(2, None)
s = list(data)
s.insert(i, None) elements = 'ABCDEFGHI'
s.pop() for i in range(-len(elements), len(elements)):
self.assertEqual(list(d), s) d = deque(elements, maxlen=len(elements)+1)
if i < len(data): d.insert(i, 'Z')
self.assertIsNone(d[i]) if i >= 0:
self.assertEqual(d[i], 'Z')
else: else:
self.assertTrue(None not in d) self.assertEqual(d[i-1], 'Z')
def test_imul(self): def test_imul(self):
for n in (-10, -1, 0, 1, 2, 10, 1000): for n in (-10, -1, 0, 1, 2, 10, 1000):

View file

@ -22,8 +22,8 @@ Core and Builtins
compiler issues. compiler issues.
- Issue #26194: Deque.insert() gave odd results for bounded deques that had - Issue #26194: Deque.insert() gave odd results for bounded deques that had
reached their maximum size. Now, the insert will happen normally and then reached their maximum size. Now an IndexError will be raised when attempting
any overflowing element will be truncated from the right side. to insert into a full deque.
- Issue #25843: When compiling code, don't merge constants if they are equal - 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`` but have a different types. For example, ``f1, f2 = lambda: 1, lambda: 1.0``

View file

@ -973,16 +973,13 @@ deque_insert(dequeobject *deque, PyObject *args)
Py_ssize_t index; Py_ssize_t index;
Py_ssize_t n = Py_SIZE(deque); Py_ssize_t n = Py_SIZE(deque);
PyObject *value; PyObject *value;
PyObject *oldvalue;
PyObject *rv; PyObject *rv;
if (!PyArg_ParseTuple(args, "nO:insert", &index, &value)) if (!PyArg_ParseTuple(args, "nO:insert", &index, &value))
return NULL; return NULL;
if (deque->maxlen == Py_SIZE(deque)) { if (deque->maxlen == Py_SIZE(deque)) {
if (index >= deque->maxlen || Py_SIZE(deque) == 0) PyErr_SetString(PyExc_IndexError, "deque already at its maximum size");
Py_RETURN_NONE; return NULL;
oldvalue = deque_pop(deque, NULL);
Py_DECREF(oldvalue);
} }
if (index >= n) if (index >= n)
return deque_append(deque, value); return deque_append(deque, value);