summaryrefslogtreecommitdiff
path: root/coverage/collector.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2014-06-12 17:17:38 -0400
committerNed Batchelder <ned@nedbatchelder.com>2014-06-12 17:17:38 -0400
commit44527cc9db62aa3979c69abe4edb7070aafd6897 (patch)
treeeb0476b7b5cab892b8e122cb3e8291b5458763c8 /coverage/collector.py
parentbe5178fda38750c0aae78061bf1b1bf3397a467d (diff)
downloadpython-coveragepy-git-44527cc9db62aa3979c69abe4edb7070aafd6897.tar.gz
Hacked-in django template support
--HG-- branch : django
Diffstat (limited to 'coverage/collector.py')
-rw-r--r--coverage/collector.py38
1 files changed, 24 insertions, 14 deletions
diff --git a/coverage/collector.py b/coverage/collector.py
index 94af5df5..07a87e03 100644
--- a/coverage/collector.py
+++ b/coverage/collector.py
@@ -45,6 +45,7 @@ class PyTracer(object):
self.should_trace = None
self.should_trace_cache = None
self.warn = None
+ self.handler = None
self.cur_file_data = None
self.last_line = 0
self.data_stack = []
@@ -76,7 +77,7 @@ class PyTracer(object):
self.cur_file_data[pair] = None
if self.coroutine_id_func:
self.data_stack = self.data_stacks[self.coroutine_id_func()]
- self.cur_file_data, self.last_line = self.data_stack.pop()
+ self.handler, self.cur_file_data, self.last_line = self.data_stack.pop()
self.last_exc_back = None
if event == 'call':
@@ -85,19 +86,22 @@ class PyTracer(object):
if self.coroutine_id_func:
self.data_stack = self.data_stacks[self.coroutine_id_func()]
self.last_coroutine = self.coroutine_id_func()
- self.data_stack.append((self.cur_file_data, self.last_line))
+ self.data_stack.append((self.handler, self.cur_file_data, self.last_line))
filename = frame.f_code.co_filename
if filename not in self.should_trace_cache:
- tracename = self.should_trace(filename, frame)
- self.should_trace_cache[filename] = tracename
+ tracename, handler = self.should_trace(filename, frame)
+ self.should_trace_cache[filename] = tracename, handler
else:
- tracename = self.should_trace_cache[filename]
+ tracename, handler = self.should_trace_cache[filename]
#print("called, stack is %d deep, tracename is %r" % (
# len(self.data_stack), tracename))
+ if tracename and handler:
+ tracename = handler.file_name(frame)
if tracename:
if tracename not in self.data:
self.data[tracename] = {}
self.cur_file_data = self.data[tracename]
+ self.handler = handler
else:
self.cur_file_data = None
# Set the last_line to -1 because the next arc will be entering a
@@ -107,14 +111,20 @@ class PyTracer(object):
# Record an executed line.
#if self.coroutine_id_func:
# assert self.last_coroutine == self.coroutine_id_func()
- if self.cur_file_data is not None:
- if self.arcs:
- #print("lin", self.last_line, frame.f_lineno)
- self.cur_file_data[(self.last_line, frame.f_lineno)] = None
- else:
- #print("lin", frame.f_lineno)
- self.cur_file_data[frame.f_lineno] = None
- self.last_line = frame.f_lineno
+ if self.handler:
+ lineno_from, lineno_to = self.handler.line_number_range(frame)
+ else:
+ lineno_from, lineno_to = frame.f_lineno, frame.f_lineno
+ if lineno_from != -1:
+ if self.cur_file_data is not None:
+ if self.arcs:
+ #print("lin", self.last_line, frame.f_lineno)
+ self.cur_file_data[(self.last_line, lineno_from)] = None
+ else:
+ #print("lin", frame.f_lineno)
+ for lineno in range(lineno_from, lineno_to+1):
+ self.cur_file_data[lineno] = None
+ self.last_line = lineno_to
elif event == 'return':
if self.arcs and self.cur_file_data:
first = frame.f_code.co_firstlineno
@@ -123,7 +133,7 @@ class PyTracer(object):
if self.coroutine_id_func:
self.data_stack = self.data_stacks[self.coroutine_id_func()]
self.last_coroutine = self.coroutine_id_func()
- self.cur_file_data, self.last_line = self.data_stack.pop()
+ self.handler, self.cur_file_data, self.last_line = self.data_stack.pop()
#print("returned, stack is %d deep" % (len(self.data_stack)))
elif event == 'exception':
#print("exc", self.last_line, frame.f_lineno)