diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2021-08-26 12:48:12 -0400 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2021-08-26 12:48:12 -0400 |
commit | 4a74b0a498314a225c19b74e6eebe85cbd509f81 (patch) | |
tree | e08a6cf0501449b9f662b3426d95c7d5e82facb2 /coverage/ctracer/tracer.c | |
parent | db235732dd9a0198f6e5d00b895baa516221fee2 (diff) | |
download | python-coveragepy-git-nedbat/fix-c-tracer.tar.gz |
Diffstat (limited to 'coverage/ctracer/tracer.c')
-rw-r--r-- | coverage/ctracer/tracer.c | 29 |
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; } |