Commit 512d2cc6 authored by Raymond Hettinger's avatar Raymond Hettinger

Issue #11004: Repair edge case in deque.count().

(Reviewed by Georg Brandl.)

Also made similar changes to deque.reverse() though this wasn't
strictly necessary (the edge case cannot occur with two pointers
moving to meet in the middle).  Making the change in reverse()
was more a matter of future-proofing.
parent 5543e813
......@@ -138,6 +138,15 @@ class TestBasic(unittest.TestCase):
m.d = d
self.assertRaises(RuntimeError, d.count, 3)
# test issue11004
# block advance failed after rotation aligned elements on right side of block
d = deque([None]*16)
for i in range(len(d)):
d.rotate(-1)
d.rotate(1)
self.assertEqual(d.count(1), 0)
self.assertEqual(d.count(None), 16)
def test_comparisons(self):
d = deque('xabc'); d.popleft()
for e in [d, deque('abc'), deque('ab'), deque(), list(d)]:
......
......@@ -16,6 +16,8 @@ Core and Builtins
Library
-------
- Issue #11004: Repaired edge case in deque.count().
- Issue #10974: IDLE no longer crashes if its recent files list includes files
with non-ASCII characters in their path names.
......
......@@ -485,7 +485,8 @@ deque_reverse(dequeobject *deque, PyObject *unused)
/* Advance left block/index pair */
leftindex++;
if (leftindex == BLOCKLEN) {
assert (leftblock->rightlink != NULL);
if (leftblock->rightlink == NULL)
break;
leftblock = leftblock->rightlink;
leftindex = 0;
}
......@@ -493,7 +494,8 @@ deque_reverse(dequeobject *deque, PyObject *unused)
/* Step backwards with the right block/index pair */
rightindex--;
if (rightindex == -1) {
assert (rightblock->leftlink != NULL);
if (rightblock->leftlink == NULL)
break;
rightblock = rightblock->leftlink;
rightindex = BLOCKLEN - 1;
}
......@@ -509,7 +511,7 @@ deque_count(dequeobject *deque, PyObject *v)
{
block *leftblock = deque->leftblock;
Py_ssize_t leftindex = deque->leftindex;
Py_ssize_t n = (deque->len);
Py_ssize_t n = deque->len;
Py_ssize_t i;
Py_ssize_t count = 0;
PyObject *item;
......@@ -533,7 +535,8 @@ deque_count(dequeobject *deque, PyObject *v)
/* Advance left block/index pair */
leftindex++;
if (leftindex == BLOCKLEN) {
assert (leftblock->rightlink != NULL);
if (leftblock->rightlink == NULL) /* can occur when i==n-1 */
break;
leftblock = leftblock->rightlink;
leftindex = 0;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment