diff options
Diffstat (limited to 'coverage')
-rw-r--r-- | coverage/collector.py | 12 | ||||
-rw-r--r-- | coverage/ctracer/tracer.c | 29 |
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; } |