]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Apply remove's mutation test after every equality test.
authorRaymond Hettinger <python@rcn.com>
Sat, 19 Mar 2005 00:00:51 +0000 (00:00 +0000)
committerRaymond Hettinger <python@rcn.com>
Sat, 19 Mar 2005 00:00:51 +0000 (00:00 +0000)
Lib/test/test_deque.py
Modules/collectionsmodule.c

index f498124cef00a523d434d4be545630253eca7c62..7e80e8c7688bf23da004074441a7ebfd3cef32c7 100644 (file)
@@ -19,11 +19,12 @@ class BadCmp:
         raise RuntimeError
 
 class MutateCmp:
-    def __init__(self, deque):
+    def __init__(self, deque, result):
         self.deque = deque
+        self.result = result
     def __eq__(self, other):
         self.deque.clear()
-        return True
+        return self.result
 
 class TestBasic(unittest.TestCase):
 
@@ -226,11 +227,11 @@ class TestBasic(unittest.TestCase):
             self.assert_(x is y)
 
         # Handle evil mutator
-        d = deque(['ab'])
-        d.extend([MutateCmp(d), 'c'])
-        e = deque(d)
-        self.assertRaises(IndexError, d.remove, 'c')
-        self.assertEqual(d, deque())
+        for match in (True, False):
+            d = deque(['ab'])
+            d.extend([MutateCmp(d, match), 'c'])
+            self.assertRaises(IndexError, d.remove, 'c')
+            self.assertEqual(d, deque())
 
     def test_repr(self):
         d = deque(xrange(200))
index 49c486fd59cfc234b8d4032c9b783377afb2d440..2fbd72990278d7e5f3f955da3e31b7b4ff9d7a8e 100644 (file)
@@ -376,14 +376,14 @@ deque_remove(dequeobject *deque, PyObject *value)
        for (i=0 ; i<n ; i++) {
                PyObject *item = deque->leftblock->data[deque->leftindex];
                int cmp = PyObject_RichCompareBool(item, value, Py_EQ);
+
+               if (deque->len != n) {
+                       PyErr_SetString(PyExc_IndexError, 
+                               "deque mutated during remove().");
+                       return NULL;
+               }
                if (cmp > 0) {
-                       PyObject *tgt;
-                       if (deque->len != n) {
-                               PyErr_SetString(PyExc_IndexError, 
-                                       "deque mutated during remove().");
-                               return NULL;
-                       }
-                       tgt = deque_popleft(deque, NULL);
+                       PyObject *tgt = deque_popleft(deque, NULL);
                        assert (tgt != NULL);
                        Py_DECREF(tgt);
                        if (_deque_rotate(deque, i) == -1)