Add trace_frame. Fixes #534864. Backported to 2.2.

This commit is contained in:
Martin v. Löwis 2002-08-04 08:24:49 +00:00
parent 5a39530274
commit 7d6e19d70c
1 changed files with 38 additions and 0 deletions

View File

@ -264,6 +264,33 @@ getcode(enum HandlerTypes slot, char* func_name, int lineno)
return NULL;
}
static int
trace_frame(PyThreadState *tstate, PyFrameObject *f, int code, PyObject *val)
{
int result = 0;
if (!tstate->use_tracing || tstate->tracing)
return 0;
if (tstate->c_profilefunc != NULL) {
tstate->tracing++;
result = tstate->c_profilefunc(tstate->c_profileobj,
f, code , val);
tstate->use_tracing = ((tstate->c_tracefunc != NULL)
|| (tstate->c_profilefunc != NULL));
tstate->tracing--;
if (result)
return result;
}
if (tstate->c_tracefunc != NULL) {
tstate->tracing++;
result = tstate->c_tracefunc(tstate->c_traceobj,
f, code , val);
tstate->use_tracing = ((tstate->c_tracefunc != NULL)
|| (tstate->c_profilefunc != NULL));
tstate->tracing--;
}
return result;
}
static PyObject*
call_with_frame(PyCodeObject *c, PyObject* func, PyObject* args)
{
@ -273,6 +300,7 @@ call_with_frame(PyCodeObject *c, PyObject* func, PyObject* args)
if (c == NULL)
return NULL;
f = PyFrame_New(
tstate, /*back*/
c, /*code*/
@ -282,9 +310,19 @@ call_with_frame(PyCodeObject *c, PyObject* func, PyObject* args)
if (f == NULL)
return NULL;
tstate->frame = f;
if (trace_frame(tstate, f, PyTrace_CALL, Py_None)) {
Py_DECREF(f);
return NULL;
}
res = PyEval_CallObject(func, args);
if (res == NULL && tstate->curexc_traceback == NULL)
PyTraceBack_Here(f);
else {
if (trace_frame(tstate, f, PyTrace_RETURN, res)) {
Py_XDECREF(res);
res = NULL;
}
}
tstate->frame = f->f_back;
Py_DECREF(f);
return res;