Index: pyexpat.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/pyexpat.c,v retrieving revision 2.66 diff -u -r2.66 pyexpat.c --- pyexpat.c 1 Jul 2002 14:02:31 -0000 2.66 +++ pyexpat.c 2 Jul 2002 07:01:35 -0000 @@ -268,6 +268,33 @@ 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) { @@ -277,6 +304,7 @@ if (c == NULL) return NULL; + f = PyFrame_New( tstate, /*back*/ c, /*code*/ @@ -286,9 +314,19 @@ 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;