Fix zero-length corner case for iterating over a mutating deque.

This commit is contained in:
Raymond Hettinger 2007-01-08 18:05:53 +00:00
parent f96725af8b
commit 5b44cbe6d8
3 changed files with 11 additions and 3 deletions

View 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

View File

@ -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
-------

View 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));