]> granicus.if.org Git - python/commitdiff
Rationalize the events passed to the profiler (no changes for the tracer).
authorFred Drake <fdrake@acm.org>
Thu, 4 Oct 2001 14:48:42 +0000 (14:48 +0000)
committerFred Drake <fdrake@acm.org>
Thu, 4 Oct 2001 14:48:42 +0000 (14:48 +0000)
The profiler does not need to know anything about the exception state,
so we no longer call it when an exception is raised.  We do, however,
make sure we *always* call the profiler when we exit a frame.  This
ensures that timing events are more easily isolated by a profiler and
finally clauses that do a lot of work don't have their time
mis-allocated.

When an exception is propogated out of the frame, the C callback for
the profiler now receives a PyTrace_RETURN event with an arg of NULL;
the Python-level profile hook function will see a 'return' event with
an arg of None.  This means that from Python it is impossible for the
profiler to determine if the frame exited with an exception or if it
returned None, but this doesn't matter for profiling.  A C-based
profiler could tell the difference, but this doesn't seem important.

ceval.c:eval_frame():  Simplify the code in two places so that the
                       profiler is called for every exit from a frame
                       and not for exceptions.

sysmodule.c:profile_trampoline():  Make sure we don't expose Python
                                   code to NULL; use None instead.

Python/ceval.c
Python/sysmodule.c

index 132fb726a606b74f9ea729f97f06ee75ff7e5cdc..99822e8f7616942e868f59447f65b7a187a8020f 100644 (file)
@@ -2198,14 +2198,9 @@ eval_frame(PyFrameObject *f)
                                f->f_lasti -= 2;
                        PyTraceBack_Here(f);
 
-                       if (tstate->use_tracing) {
-                               if (tstate->c_tracefunc)
-                                       call_exc_trace(tstate->c_tracefunc,
-                                                      tstate->c_traceobj, f);
-                               if (tstate->c_profilefunc)
-                                       call_exc_trace(tstate->c_profilefunc,
-                                                      tstate->c_profileobj,f);
-                       }
+                       if (tstate->c_tracefunc != NULL)
+                               call_exc_trace(tstate->c_tracefunc,
+                                              tstate->c_traceobj, f);
                }
 
                /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
@@ -2301,8 +2296,7 @@ eval_frame(PyFrameObject *f)
                                why = WHY_EXCEPTION;
                        }
                }
-               if (tstate->c_profilefunc
-                   && (why == WHY_RETURN || why == WHY_YIELD)) {
+               if (tstate->c_profilefunc) {
                        if (call_trace(tstate->c_profilefunc,
                                       tstate->c_profileobj, f,
                                       PyTrace_RETURN, retval)) {
index 82d29997cb0ab36a81240a4b1499befd53bf563c..deead3a93495ffcfb4f26677a725ac5ceb1f5256 100644 (file)
@@ -260,6 +260,8 @@ profile_trampoline(PyObject *self, PyFrameObject *frame,
        PyThreadState *tstate = frame->f_tstate;
        PyObject *result;
 
+       if (arg == NULL)
+               arg = Py_None;
        result = call_trampoline(tstate, self, frame, what, arg);
        if (result == NULL) {
                PyEval_SetProfile(NULL, NULL);