mirror of https://github.com/python/cpython.git
Add trace_frame. Fixes #534864. Backported to 2.2.
This commit is contained in:
parent
5a39530274
commit
7d6e19d70c
|
@ -264,6 +264,33 @@ getcode(enum HandlerTypes slot, char* func_name, int lineno)
|
||||||
return NULL;
|
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*
|
static PyObject*
|
||||||
call_with_frame(PyCodeObject *c, PyObject* func, PyObject* args)
|
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)
|
if (c == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
f = PyFrame_New(
|
f = PyFrame_New(
|
||||||
tstate, /*back*/
|
tstate, /*back*/
|
||||||
c, /*code*/
|
c, /*code*/
|
||||||
|
@ -282,9 +310,19 @@ call_with_frame(PyCodeObject *c, PyObject* func, PyObject* args)
|
||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
tstate->frame = f;
|
tstate->frame = f;
|
||||||
|
if (trace_frame(tstate, f, PyTrace_CALL, Py_None)) {
|
||||||
|
Py_DECREF(f);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
res = PyEval_CallObject(func, args);
|
res = PyEval_CallObject(func, args);
|
||||||
if (res == NULL && tstate->curexc_traceback == NULL)
|
if (res == NULL && tstate->curexc_traceback == NULL)
|
||||||
PyTraceBack_Here(f);
|
PyTraceBack_Here(f);
|
||||||
|
else {
|
||||||
|
if (trace_frame(tstate, f, PyTrace_RETURN, res)) {
|
||||||
|
Py_XDECREF(res);
|
||||||
|
res = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
tstate->frame = f->f_back;
|
tstate->frame = f->f_back;
|
||||||
Py_DECREF(f);
|
Py_DECREF(f);
|
||||||
return res;
|
return res;
|
||||||
|
|
Loading…
Reference in New Issue