Commit 57a8689b authored by Raymond Hettinger's avatar Raymond Hettinger

Issue 11004: Fix edge case for deque.count().

parent 51581de1
...@@ -137,6 +137,15 @@ class TestBasic(unittest.TestCase): ...@@ -137,6 +137,15 @@ class TestBasic(unittest.TestCase):
m.d = d m.d = d
self.assertRaises(RuntimeError, d.count, 3) 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): def test_comparisons(self):
d = deque('xabc'); d.popleft() d = deque('xabc'); d.popleft()
for e in [d, deque('abc'), deque('ab'), deque(), list(d)]: for e in [d, deque('abc'), deque('ab'), deque(), list(d)]:
......
...@@ -19,6 +19,8 @@ Core and Builtins ...@@ -19,6 +19,8 @@ Core and Builtins
non-Python managed memory while it is being modified by another thread. non-Python managed memory while it is being modified by another thread.
Patch by Matt Bandy. Patch by Matt Bandy.
- Issue #11004: Repaired edge case in deque.count().
- Issue #8278: On Windows and with a NTFS filesystem, os.stat() and os.utime() - Issue #8278: On Windows and with a NTFS filesystem, os.stat() and os.utime()
can now handle dates after 2038. can now handle dates after 2038.
......
...@@ -485,7 +485,8 @@ deque_reverse(dequeobject *deque, PyObject *unused) ...@@ -485,7 +485,8 @@ deque_reverse(dequeobject *deque, PyObject *unused)
/* Advance left block/index pair */ /* Advance left block/index pair */
leftindex++; leftindex++;
if (leftindex == BLOCKLEN) { if (leftindex == BLOCKLEN) {
assert (leftblock->rightlink != NULL); if (leftblock->rightlink == NULL)
break;
leftblock = leftblock->rightlink; leftblock = leftblock->rightlink;
leftindex = 0; leftindex = 0;
} }
...@@ -493,7 +494,8 @@ deque_reverse(dequeobject *deque, PyObject *unused) ...@@ -493,7 +494,8 @@ deque_reverse(dequeobject *deque, PyObject *unused)
/* Step backwards with the right block/index pair */ /* Step backwards with the right block/index pair */
rightindex--; rightindex--;
if (rightindex == -1) { if (rightindex == -1) {
assert (rightblock->leftlink != NULL); if (rightblock->leftlink == NULL)
break;
rightblock = rightblock->leftlink; rightblock = rightblock->leftlink;
rightindex = BLOCKLEN - 1; rightindex = BLOCKLEN - 1;
} }
...@@ -509,7 +511,7 @@ deque_count(dequeobject *deque, PyObject *v) ...@@ -509,7 +511,7 @@ deque_count(dequeobject *deque, PyObject *v)
{ {
block *leftblock = deque->leftblock; block *leftblock = deque->leftblock;
Py_ssize_t leftindex = deque->leftindex; 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 i;
Py_ssize_t count = 0; Py_ssize_t count = 0;
PyObject *item; PyObject *item;
...@@ -533,7 +535,8 @@ deque_count(dequeobject *deque, PyObject *v) ...@@ -533,7 +535,8 @@ deque_count(dequeobject *deque, PyObject *v)
/* Advance left block/index pair */ /* Advance left block/index pair */
leftindex++; leftindex++;
if (leftindex == BLOCKLEN) { if (leftindex == BLOCKLEN) {
assert (leftblock->rightlink != NULL); if (leftblock->rightlink == NULL) /* can occur when i==n-1 */
break;
leftblock = leftblock->rightlink; leftblock = leftblock->rightlink;
leftindex = 0; 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