]> granicus.if.org Git - python/commitdiff
Issue #20024: Py_BuildValue() now saves/restores the current exception before
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 21 Jan 2014 19:52:17 +0000 (20:52 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 21 Jan 2014 19:52:17 +0000 (20:52 +0100)
building an item if the build of a previous item failed.

Python/modsupport.c

index 428914f3788a0dde223db6186016ea112d33f73b..6c938ddd797e549260f2318d582f1a1421439b7d 100644 (file)
@@ -161,7 +161,17 @@ do_mktuple(const char **p_format, va_list *p_va, int endchar, int n, int flags)
     /* Note that we can't bail immediately on error as this will leak
        refcounts on any 'N' arguments. */
     for (i = 0; i < n; i++) {
-        PyObject *w = do_mkvalue(p_format, p_va, flags);
+        PyObject *w;
+
+        if (itemfailed) {
+            PyObject *exception, *value, *tb;
+            PyErr_Fetch(&exception, &value, &tb);
+            w = do_mkvalue(p_format, p_va, flags);
+            PyErr_Restore(exception, value, tb);
+        }
+        else {
+            w = do_mkvalue(p_format, p_va, flags);
+        }
         if (w == NULL) {
             itemfailed = 1;
             Py_INCREF(Py_None);