From 55fb6e037170ddb645c552079ec8fe6c042de542 Mon Sep 17 00:00:00 2001 From: Fred Drake Date: Wed, 27 Jun 2001 19:18:03 +0000 Subject: Revise the interface to the profiling and tracing support for the Python interpreter. This change adds two new C-level APIs: PyEval_SetProfile() and PyEval_SetTrace(). These can be used to install profile and trace functions implemented in C, which can operate at much higher speeds than Python-based functions. The overhead for calling a C-based profile function is a very small fraction of a percent of the overhead involved in calling a Python-based function. The machinery required to call a Python-based profile or trace function been moved to sysmodule.c, where sys.setprofile() and sys.setprofile() simply become users of the new interface. --- Include/ceval.h | 3 +++ Include/pystate.h | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Include/ceval.h b/Include/ceval.h index 4e6889e..19ac064 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -22,6 +22,9 @@ DL_IMPORT(PyObject *) PyEval_CallFunction(PyObject *obj, char *format, ...); DL_IMPORT(PyObject *) PyEval_CallMethod(PyObject *obj, char *methodname, char *format, ...); +DL_IMPORT(void) PyEval_SetProfile(Py_tracefunc, PyObject *); +DL_IMPORT(void) PyEval_SetTrace(Py_tracefunc, PyObject *); + DL_IMPORT(PyObject *) PyEval_GetBuiltins(void); DL_IMPORT(PyObject *) PyEval_GetGlobals(void); DL_IMPORT(PyObject *) PyEval_GetLocals(void); diff --git a/Include/pystate.h b/Include/pystate.h index 27ffe32..d5e2e1f 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -31,6 +31,15 @@ typedef struct _is { struct _frame; /* Avoid including frameobject.h */ +/* Py_tracefunc return -1 when raising an exception, or 0 for success. */ +typedef int (*Py_tracefunc)(PyObject *, struct _frame *, int, PyObject *); + +/* The following values are used for 'what' for tracefunc functions: */ +#define PyTrace_CALL 0 +#define PyTrace_EXCEPTION 1 +#define PyTrace_LINE 2 +#define PyTrace_RETURN 3 + typedef struct _ts { struct _ts *next; @@ -41,8 +50,10 @@ typedef struct _ts { int ticker; int tracing; - PyObject *sys_profilefunc; - PyObject *sys_tracefunc; + Py_tracefunc c_profilefunc; + Py_tracefunc c_tracefunc; + PyObject *c_profileobj; + PyObject *c_traceobj; PyObject *curexc_type; PyObject *curexc_value; -- cgit v0.12