]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Revise the interface to the profiling and tracing support for the
authorFred Drake <fdrake@acm.org>
Wed, 27 Jun 2001 19:18:03 +0000 (19:18 +0000)
committerFred Drake <fdrake@acm.org>
Wed, 27 Jun 2001 19:18:03 +0000 (19:18 +0000)
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
Include/pystate.h

index 4e6889e205901b1ab735ff4eefdfe327504af87d..19ac064fdc07868237994bc00e4cbae071c6edc3 100644 (file)
@@ -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);
index 27ffe32437f41a3606853426468bd35f60620bfb..d5e2e1f119336f44dea4e1b41bd9c108c5a84c84 100644 (file)
@@ -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;