]> granicus.if.org Git - python/commitdiff
Port from the Python 2.4 branch, patches for SF bug # 900092,
authorBarry Warsaw <barry@python.org>
Mon, 15 Aug 2005 18:14:19 +0000 (18:14 +0000)
committerBarry Warsaw <barry@python.org>
Mon, 15 Aug 2005 18:14:19 +0000 (18:14 +0000)
hotshot.stats.load.

Lib/test/test_trace.py
Misc/NEWS
Python/ceval.c

index f85c669630216d8b231cca19d4f0e26f4a6dd3df..7f866fbcf539ddbc2d7472e9abca07fd6e3d8766 100644 (file)
@@ -97,6 +97,7 @@ test_raise.events = [(0, 'call'),
                      (-3, 'call'),
                      (-2, 'line'),
                      (-2, 'exception'),
+                     (-2, 'return'),
                      (2, 'exception'),
                      (3, 'line'),
                      (4, 'line'),
index ecbbd97e96abdee7d260ea9d5726fc734e2ffe8b..62e6656f868b872d682009bbfcfd7e48d1cf1af8 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 2.5 alpha 1?
 Core and builtins
 -----------------
 
+- SF bug #900092: When tracing (e.g. for hotshot), restore 'return' events for
+  exceptions that cause a function to exit.
+
 - The implementation of set() and frozenset() was revised to use its
   own internal data structure.  Memory consumption is reduced by 1/3
   and there are modest speed-ups as well.  The API is unchanged.
index d311537c8ea2165a4a09514184ce51157b6bed18..ee3c7bbb98376105d036c6de1c85da82e535de67 100644 (file)
@@ -2480,14 +2480,20 @@ fast_block_end:
 
 fast_yield:
        if (tstate->use_tracing) {
-               if (tstate->c_tracefunc
-                   && (why == WHY_RETURN || why == WHY_YIELD)) {
-                       if (call_trace(tstate->c_tracefunc,
-                                      tstate->c_traceobj, f,
-                                      PyTrace_RETURN, retval)) {
-                               Py_XDECREF(retval);
-                               retval = NULL;
-                               why = WHY_EXCEPTION;
+               if (tstate->c_tracefunc) {
+                       if (why == WHY_RETURN || why == WHY_YIELD) {
+                               if (call_trace(tstate->c_tracefunc,
+                                              tstate->c_traceobj, f,
+                                              PyTrace_RETURN, retval)) {
+                                       Py_XDECREF(retval);
+                                       retval = NULL;
+                                       why = WHY_EXCEPTION;
+                               }
+                       }
+                       else if (why == WHY_EXCEPTION) {
+                               call_trace_protected(tstate->c_tracefunc,
+                                                    tstate->c_traceobj, f,
+                                                    PyTrace_RETURN);
                        }
                }
                if (tstate->c_profilefunc) {