diff options
Diffstat (limited to 'coverage')
-rw-r--r-- | coverage/ctracer/tracer.c | 7 | ||||
-rw-r--r-- | coverage/parser.py | 12 | ||||
-rw-r--r-- | coverage/pytracer.py | 7 |
3 files changed, 17 insertions, 9 deletions
diff --git a/coverage/ctracer/tracer.c b/coverage/ctracer/tracer.c index 0c9a4867..ac16b6b5 100644 --- a/coverage/ctracer/tracer.c +++ b/coverage/ctracer/tracer.c @@ -545,7 +545,12 @@ CTracer_handle_call(CTracer *self, PyFrameObject *frame) * re-entering a generator also. f_lasti is -1 for a true call, and a * real byte offset for a generator re-entry. */ - self->cur_entry.last_line = (frame->f_lasti < 0) ? -1 : frame->f_lineno; + if (frame->f_lasti < 0) { + self->cur_entry.last_line = -frame->f_code->co_firstlineno; + } + else { + self->cur_entry.last_line = frame->f_lineno; + } ok: ret = RET_OK; diff --git a/coverage/parser.py b/coverage/parser.py index f34a26fb..f4dd02d4 100644 --- a/coverage/parser.py +++ b/coverage/parser.py @@ -908,18 +908,18 @@ class AstArcAnalyzer(object): def _code_object__Module(self, node): start = self.line_for_node(node) if node.body: - exits = self.add_body_arcs(node.body, from_start=ArcStart(-1)) + exits = self.add_body_arcs(node.body, from_start=ArcStart(-start)) for xit in exits: self.add_arc(xit.lineno, -start, xit.cause, "didn't exit the module") else: # Empty module. - self.add_arc(-1, start) - self.add_arc(start, -1) + self.add_arc(-start, start) + self.add_arc(start, -start) def _code_object__FunctionDef(self, node): start = self.line_for_node(node) self.block_stack.append(FunctionBlock(start=start, name=node.name)) - exits = self.add_body_arcs(node.body, from_start=ArcStart(-1)) + exits = self.add_body_arcs(node.body, from_start=ArcStart(-start)) self.process_return_exits(exits) self.block_stack.pop() @@ -927,7 +927,7 @@ class AstArcAnalyzer(object): def _code_object__ClassDef(self, node): start = self.line_for_node(node) - self.add_arc(-1, start) + self.add_arc(-start, start) exits = self.add_body_arcs(node.body, from_start=ArcStart(start)) for xit in exits: self.add_arc( @@ -939,7 +939,7 @@ class AstArcAnalyzer(object): """A function to make methods for online callable _code_object__ methods.""" def _code_object__oneline_callable(self, node): start = self.line_for_node(node) - self.add_arc(-1, start) + self.add_arc(-start, start) self.add_arc( start, -start, None, "didn't run the {0} on line {1}".format(noun, start), diff --git a/coverage/pytracer.py b/coverage/pytracer.py index cdb3ae70..47432324 100644 --- a/coverage/pytracer.py +++ b/coverage/pytracer.py @@ -92,9 +92,12 @@ class PyTracer(object): self.cur_file_dict = self.data[tracename] # The call event is really a "start frame" event, and happens for # function calls and re-entering generators. The f_lasti field is - # -1 for calls, and a real offset for generators. Use -1 as the + # -1 for calls, and a real offset for generators. Use <0 as the # line number for calls, and the real line number for generators. - self.last_line = -1 if (frame.f_lasti < 0) else frame.f_lineno + if frame.f_lasti < 0: + self.last_line = -frame.f_code.co_firstlineno + else: + self.last_line = frame.f_lineno elif event == 'line': # Record an executed line. if self.cur_file_dict is not None: |