]> granicus.if.org Git - python/commitdiff
Issue 11004: Fix edge case for deque.count().
authorRaymond Hettinger <python@rcn.com>
Tue, 25 Jan 2011 21:43:29 +0000 (21:43 +0000)
committerRaymond Hettinger <python@rcn.com>
Tue, 25 Jan 2011 21:43:29 +0000 (21:43 +0000)
Lib/test/test_deque.py
Misc/NEWS
Modules/_collectionsmodule.c

index 1d3f726839a0e37401eb5b231fbd354238da3ffe..a0d30f182810b7ec930427ee43482af519564b1e 100644 (file)
@@ -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)]:
index 42ce636bc2e3a8ad367c7335e7f91d8f697571e6..f244c2336dbaac2f4901ac6f835133f0529b8375 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.
 
index c140e9777ce9a25200ff20f500d0ae9a24d56e4d..faa2577f2aae50cee280ffaac317bb412bdaa529 100644 (file)
@@ -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;
         }