Move call_trace(..., PyTrace_CALL, ...) call to top of eval_frame. That

way it's called each time a generator is resumed.  The tracing of normal
functions should be unaffected by this change.
This commit is contained in:
Neil Schemenauer 2001-09-04 19:03:35 +00:00
parent 1b41079fd9
commit 6c0f20088f
1 changed files with 35 additions and 35 deletions

View File

@ -588,6 +588,41 @@ eval_frame(PyFrameObject *f)
assert(stack_pointer != NULL); assert(stack_pointer != NULL);
f->f_stacktop = NULL; f->f_stacktop = NULL;
if (tstate->use_tracing) {
if (tstate->c_tracefunc != NULL) {
/* tstate->c_tracefunc, if defined, is a
function that will be called on *every* entry
to a code block. Its return value, if not
None, is a function that will be called at
the start of each executed line of code.
(Actually, the function must return itself
in order to continue tracing.) The trace
functions are called with three arguments:
a pointer to the current frame, a string
indicating why the function is called, and
an argument which depends on the situation.
The global trace function is also called
whenever an exception is detected. */
if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
f, PyTrace_CALL, Py_None)) {
/* XXX Need way to compute arguments?? */
/* Trace function raised an error */
return NULL;
}
}
if (tstate->c_profilefunc != NULL) {
/* Similar for c_profilefunc, except it needn't
return itself and isn't called for "line" events */
if (call_trace(tstate->c_profilefunc,
tstate->c_profileobj,
f, PyTrace_CALL, Py_None)) {
/* XXX Need way to compute arguments?? */
/* Profile function raised an error */
return NULL;
}
}
}
#ifdef LLTRACE #ifdef LLTRACE
lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL; lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
#endif #endif
@ -2496,41 +2531,6 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
} }
} }
if (tstate->use_tracing) {
if (tstate->c_tracefunc != NULL) {
/* tstate->c_tracefunc, if defined, is a
function that will be called on *every* entry
to a code block. Its return value, if not
None, is a function that will be called at
the start of each executed line of code.
(Actually, the function must return itself
in order to continue tracing.) The trace
functions are called with three arguments:
a pointer to the current frame, a string
indicating why the function is called, and
an argument which depends on the situation.
The global trace function is also called
whenever an exception is detected. */
if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
f, PyTrace_CALL, Py_None)) {
/* XXX Need way to compute arguments?? */
/* Trace function raised an error */
goto fail;
}
}
if (tstate->c_profilefunc != NULL) {
/* Similar for c_profilefunc, except it needn't
return itself and isn't called for "line" events */
if (call_trace(tstate->c_profilefunc,
tstate->c_profileobj,
f, PyTrace_CALL, Py_None)) {
/* XXX Need way to compute arguments?? */
/* Profile function raised an error */
goto fail;
}
}
}
if (co->co_flags & CO_GENERATOR) { if (co->co_flags & CO_GENERATOR) {
/* Don't need to keep the reference to f_back, it will be set /* Don't need to keep the reference to f_back, it will be set
* when the generator is resumed. */ * when the generator is resumed. */