summaryrefslogtreecommitdiff
path: root/coverage/ctracer/tracer.c
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2021-08-26 12:48:12 -0400
committerNed Batchelder <ned@nedbatchelder.com>2021-08-26 12:48:12 -0400
commit4a74b0a498314a225c19b74e6eebe85cbd509f81 (patch)
treee08a6cf0501449b9f662b3426d95c7d5e82facb2 /coverage/ctracer/tracer.c
parentdb235732dd9a0198f6e5d00b895baa516221fee2 (diff)
downloadpython-coveragepy-git-nedbat/fix-c-tracer.tar.gz
Diffstat (limited to 'coverage/ctracer/tracer.c')
-rw-r--r--coverage/ctracer/tracer.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/coverage/ctracer/tracer.c b/coverage/ctracer/tracer.c
index 00d9f106..80601c14 100644
--- a/coverage/ctracer/tracer.c
+++ b/coverage/ctracer/tracer.c
@@ -781,12 +781,40 @@ CTracer_handle_exception(CTracer *self, PyFrameObject *frame)
return RET_OK;
}
+static CTracer *self_stack[1000];
+static int self_stack_top = -1;
+static CTracer *the_tracer;
+
/*
* The Trace Function
*/
static int
CTracer_trace(CTracer *self, PyFrameObject *frame, int what, PyObject *arg_unused)
{
+ switch (what) {
+ case PyTrace_CALL:
+ if (self_stack_top == -1) {
+ self_stack_top = 0;
+ self = the_tracer;
+ }
+ else {
+ self_stack_top++;
+ }
+ self_stack[self_stack_top] = self;
+ break;
+
+ case PyTrace_RETURN:
+ if (self_stack_top >= 0) {
+ self_stack_top--;
+ }
+ break;
+ }
+
+ if (self_stack_top == -1) {
+ return RET_OK;
+ }
+ self = self_stack[self_stack_top];
+
int ret = RET_ERROR;
#if DO_NOTHING
@@ -990,6 +1018,7 @@ CTracer_start(CTracer *self, PyObject *args_unused)
/* start() returns a trace function usable with sys.settrace() */
Py_INCREF(self);
+ the_tracer = self;
return (PyObject *)self;
}