From: Martin v. Löwis Date: Sun, 4 Aug 2002 08:26:49 +0000 (+0000) Subject: Add trace_frame. Fixes #534864. X-Git-Tag: v2.2.2b1~243 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=af1d30830523d8b52358d2063b2a816027f4690d;p=thirdparty%2FPython%2Fcpython.git Add trace_frame. Fixes #534864. --- diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 3ea022a778d6..4d09e3d41af0 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -352,6 +352,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) { @@ -361,6 +388,7 @@ call_with_frame(PyCodeObject *c, PyObject* func, PyObject* args) if (c == NULL) return NULL; + f = PyFrame_New( tstate, /*back*/ c, /*code*/ @@ -370,9 +398,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;