]> granicus.if.org Git - python/commitdiff
Fix zero-length corner case for iterating over a mutating deque.
authorRaymond Hettinger <python@rcn.com>
Mon, 8 Jan 2007 18:05:53 +0000 (18:05 +0000)
committerRaymond Hettinger <python@rcn.com>
Mon, 8 Jan 2007 18:05:53 +0000 (18:05 +0000)
Lib/test/test_deque.py
Misc/NEWS
Modules/collectionsmodule.c

index a562922993625277655ce13468becf26893f0189..35e153653299133e92a610515fafb1bc36a1f2f6 100644 (file)
@@ -396,6 +396,12 @@ class TestVariousIteratorArgs(unittest.TestCase):
         d.pop()
         self.assertRaises(RuntimeError, it.next)
 
+    def test_runtime_error_on_empty_deque(self):
+        d = deque()
+        it = iter(d)
+        d.append(10)
+        self.assertRaises(RuntimeError, it.next)
+
 class Deque(deque):
     pass
 
index 76ed61e83542a928d73cdc333a710b3967ba6287..4df89dade95130905dd265927ee82504be49f18d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -129,6 +129,9 @@ Extension Modules
 
 - Added support for linking the bsddb module against BerkeleyDB 4.5.x.
 
+- Modifying an empty deque during iteration now raises RuntimeError
+  instead of StopIteration.
+
 
 Library
 -------
index c1bd732b322670b60ee1582f55b2742a8d4dec16..a0570cde373c201ac929b86410a7e2b2efec1ca5 100644 (file)
@@ -911,15 +911,14 @@ dequeiter_next(dequeiterobject *it)
 {
        PyObject *item;
 
-       if (it->counter == 0)
-               return NULL;
-
        if (it->deque->state != it->state) {
                it->counter = 0;
                PyErr_SetString(PyExc_RuntimeError,
                                "deque mutated during iteration");
                return NULL;
        }
+       if (it->counter == 0)
+               return NULL;        
        assert (!(it->b == it->deque->rightblock &&
                  it->index > it->deque->rightindex));