]> granicus.if.org Git - python/commitdiff
Backport of r58004.
authorArmin Rigo <arigo@tunes.org>
Thu, 6 Sep 2007 08:35:34 +0000 (08:35 +0000)
committerArmin Rigo <arigo@tunes.org>
Thu, 6 Sep 2007 08:35:34 +0000 (08:35 +0000)
Modules/_lsprof.c

index d35c894c5aae69cb59db0fdc15c5c20d42888c71..7eb96823231656fceda4b641a1960b6b3688b1d3 100644 (file)
@@ -369,11 +369,20 @@ ptrace_enter_call(PyObject *self, void *key, PyObject *userObj)
        ProfilerEntry *profEntry;
        ProfilerContext *pContext;
 
+       /* In the case of entering a generator expression frame via a
+        * throw (gen_send_ex(.., 1)), we may already have an
+        * Exception set here. We must not mess around with this
+        * exception, and some of the code under here assumes that
+        * PyErr_* is its own to mess around with, so we have to
+        * save and restore any current exception. */
+       PyObject *last_type, *last_value, *last_tb;
+       PyErr_Fetch(&last_type, &last_value, &last_tb);
+
        profEntry = getEntry(pObj, key);
        if (profEntry == NULL) {
                profEntry = newProfilerEntry(pObj, key, userObj);
                if (profEntry == NULL)
-                       return;
+                       goto restorePyerr;
        }
        /* grab a ProfilerContext out of the free list */
        pContext = pObj->freelistProfilerContext;
@@ -386,10 +395,13 @@ ptrace_enter_call(PyObject *self, void *key, PyObject *userObj)
                        malloc(sizeof(ProfilerContext));
                if (pContext == NULL) {
                        pObj->flags |= POF_NOMEMORY;
-                       return;
+                       goto restorePyerr;
                }
        }
        initContext(pObj, pContext, profEntry);
+
+restorePyerr:
+       PyErr_Restore(last_type, last_value, last_tb);
 }
 
 static void