Skip to content

Commit d73202c

Browse files
committed
Apply remove's mutation test after every equality test.
1 parent 4aec61e commit d73202c

2 files changed

Lines changed: 15 additions & 14 deletions

File tree

Lib/test/test_deque.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@ def __eq__(self, other):
1919
raise RuntimeError
2020

2121
class MutateCmp:
22-
def __init__(self, deque):
22+
def __init__(self, deque, result):
2323
self.deque = deque
24+
self.result = result
2425
def __eq__(self, other):
2526
self.deque.clear()
26-
return True
27+
return self.result
2728

2829
class TestBasic(unittest.TestCase):
2930

@@ -226,11 +227,11 @@ def test_remove(self):
226227
self.assert_(x is y)
227228

228229
# Handle evil mutator
229-
d = deque(['ab'])
230-
d.extend([MutateCmp(d), 'c'])
231-
e = deque(d)
232-
self.assertRaises(IndexError, d.remove, 'c')
233-
self.assertEqual(d, deque())
230+
for match in (True, False):
231+
d = deque(['ab'])
232+
d.extend([MutateCmp(d, match), 'c'])
233+
self.assertRaises(IndexError, d.remove, 'c')
234+
self.assertEqual(d, deque())
234235

235236
def test_repr(self):
236237
d = deque(xrange(200))

Modules/collectionsmodule.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -376,14 +376,14 @@ deque_remove(dequeobject *deque, PyObject *value)
376376
for (i=0 ; i<n ; i++) {
377377
PyObject *item = deque->leftblock->data[deque->leftindex];
378378
int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
379+
380+
if (deque->len != n) {
381+
PyErr_SetString(PyExc_IndexError,
382+
"deque mutated during remove().");
383+
return NULL;
384+
}
379385
if (cmp > 0) {
380-
PyObject *tgt;
381-
if (deque->len != n) {
382-
PyErr_SetString(PyExc_IndexError,
383-
"deque mutated during remove().");
384-
return NULL;
385-
}
386-
tgt = deque_popleft(deque, NULL);
386+
PyObject *tgt = deque_popleft(deque, NULL);
387387
assert (tgt != NULL);
388388
Py_DECREF(tgt);
389389
if (_deque_rotate(deque, i) == -1)

0 commit comments

Comments
 (0)