summaryrefslogtreecommitdiff
path: root/coverage
diff options
context:
space:
mode:
Diffstat (limited to 'coverage')
-rw-r--r--coverage/ctracer/tracer.c7
-rw-r--r--coverage/parser.py12
-rw-r--r--coverage/pytracer.py7
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: