diff options
author | Raymond Hettinger <python@rcn.com> | 2011-01-25 21:43:29 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2011-01-25 21:43:29 (GMT) |
commit | 57a8689b55ee3a26f53b4b743901b3a55b57b46c (patch) | |
tree | 9a6f76c1a36b8a510baa7b9ca4f0cf58cd326d47 | |
parent | 51581de168f1c931b144fb8c61cdfbaf2c53734f (diff) | |
download | cpython-57a8689b55ee3a26f53b4b743901b3a55b57b46c.zip cpython-57a8689b55ee3a26f53b4b743901b3a55b57b46c.tar.gz cpython-57a8689b55ee3a26f53b4b743901b3a55b57b46c.tar.bz2 |
Issue 11004: Fix edge case for deque.count().
-rw-r--r-- | Lib/test/test_deque.py | 9 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Modules/_collectionsmodule.c | 11 |
3 files changed, 18 insertions, 4 deletions
diff --git a/Lib/test/test_deque.py b/Lib/test/test_deque.py index 1d3f726..a0d30f1 100644 --- a/Lib/test/test_deque.py +++ b/Lib/test/test_deque.py @@ -137,6 +137,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)]: @@ -19,6 +19,8 @@ Core and Builtins non-Python managed memory while it is being modified by another thread. 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() can now handle dates after 2038. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index c140e97..faa2577 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -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; } |