]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Make sure the list.sort's decorate step unwinds itself before returning
authorRaymond Hettinger <python@rcn.com>
Fri, 28 Nov 2003 21:43:02 +0000 (21:43 +0000)
committerRaymond Hettinger <python@rcn.com>
Fri, 28 Nov 2003 21:43:02 +0000 (21:43 +0000)
an exception raised by the key function.
(Suggested by Michael Hudson.)

Lib/test/test_sort.py
Objects/listobject.c

index 053b3381d57d310e08cbe70a2c9ca7dae12b933e..2659a9088d443eb36dfed946f189b32e749a9ba6 100644 (file)
@@ -186,6 +186,13 @@ class TestDecorateSortUndecorate(unittest.TestCase):
         data = 'The quick Brown fox Jumped over The lazy Dog'.split()
         self.assertRaises(TypeError, data.sort, "bad", str.lower)
 
+    def test_key_with_exception(self):
+        # Verify that the wrapper has been removed
+        data = range(-2,2)
+        dup = data[:]
+        self.assertRaises(ZeroDivisionError, data.sort, None, lambda x: 1/x)
+        self.assertEqual(data, dup)
+
     def test_reverse(self):
         data = range(100)
         random.shuffle(data)
index 3782c3baacfde52834f715a9279bb499e2a0e877..95aa484f2be39ba4b09378f7d107d4f1d939865d 100644 (file)
@@ -1876,8 +1876,15 @@ listsort(PyListObject *self, PyObject *args, PyObject *kwds)
                        value = PyList_GET_ITEM(self, i);
                        key = PyObject_CallFunctionObjArgs(keyfunc, value, 
                                                           NULL);
-                       if (key == NULL)
+                       if (key == NULL) {
+                               for (i=i-1 ; i>=0 ; i--) {
+                                       kvpair = PyList_GET_ITEM(self, i);
+                                       value = sortwrapper_getvalue(kvpair);
+                                       PyList_SET_ITEM(self, i, value);
+                                       Py_DECREF(kvpair);
+                               }
                                goto dsu_fail;
+                       }
                        kvpair = build_sortwrapper(key, value);
                        if (kvpair == NULL)
                                goto dsu_fail;
@@ -1885,7 +1892,7 @@ listsort(PyListObject *self, PyObject *args, PyObject *kwds)
                }
        }
 
-       /* Reverse sort stability achieved by initialially reversing the list,
+       /* Reverse sort stability achieved by initially reversing the list,
        applying a stable forward sort, then reversing the final result. */
        if (reverse && self->ob_size > 1)
                reverse_slice(self->ob_item, self->ob_item + self->ob_size);