summaryrefslogtreecommitdiff
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
parentdb235732dd9a0198f6e5d00b895baa516221fee2 (diff)
downloadpython-coveragepy-git-nedbat/fix-c-tracer.tar.gz
-rw-r--r--coverage/collector.py12
-rw-r--r--coverage/ctracer/tracer.c29
2 files changed, 41 insertions, 0 deletions
diff --git a/coverage/collector.py b/coverage/collector.py
index 73babf44..992c8578 100644
--- a/coverage/collector.py
+++ b/coverage/collector.py
@@ -15,6 +15,10 @@ from coverage.pytracer import PyTracer
os = isolate_module(os)
+def debugmsg(msg, flush=True):
+ return
+ with open("/tmp/debug.txt", "a") as f:
+ print(msg, file=f, flush=True)
try:
# Use the C extension code when we can, for speed.
@@ -233,7 +237,9 @@ class Collector:
def _start_tracer(self):
"""Start a new Tracer object, and store it in self.tracers."""
+ debugmsg("Making a new tracer")
tracer = self._trace_class()
+ debugmsg("Made a new tracer")
tracer.data = self.data
tracer.trace_arcs = self.branch
tracer.should_trace = self.should_trace
@@ -261,7 +267,9 @@ class Collector:
if hasattr(tracer, 'disable_plugin'):
tracer.disable_plugin = self.disable_plugin
+ debugmsg("about to start")
fn = tracer.start()
+ debugmsg("started")
self.tracers.append(tracer)
return fn
@@ -303,7 +311,9 @@ class Collector:
try:
# Install the tracer on this thread.
+ debugmsg("About to start", flush=True)
fn = self._start_tracer()
+ debugmsg("Started", flush=True)
except:
if self._collectors:
self._collectors[-1].resume()
@@ -311,7 +321,9 @@ class Collector:
# If _start_tracer succeeded, then we add ourselves to the global
# stack of collectors.
+ debugmsg("About to append", flush=True)
self._collectors.append(self)
+ debugmsg("Appended", flush=True)
# Replay all the events from fullcoverage into the new trace function.
for args in traces0:
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;
}