diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2015-04-20 12:21:15 -0400 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2015-04-20 12:21:15 -0400 |
commit | 1b81747e52752a30be1c4271e24d23a7cb3f71b4 (patch) | |
tree | 8297b06a003a0c1a79c2bf391d2c0f0cfb128d81 /coverage/tracer.c | |
parent | 03eb833bac7731bd6dfd4ca5d0eae1da7213eb57 (diff) | |
parent | de4cfde7b1f7b3d3bee11a26b4c1bb3ae598259c (diff) | |
download | python-coveragepy-git-1b81747e52752a30be1c4271e24d23a7cb3f71b4.tar.gz |
Merge issue-324 fix
Diffstat (limited to 'coverage/tracer.c')
-rw-r--r-- | coverage/tracer.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/coverage/tracer.c b/coverage/tracer.c index 52543b81..1ce5ed20 100644 --- a/coverage/tracer.c +++ b/coverage/tracer.c @@ -3,6 +3,7 @@ #include "Python.h" #include "structmember.h" #include "frameobject.h" +#include "opcode.h" /* Compile-time debugging helpers */ #undef WHAT_LOG /* Define to log the WHAT params in the trace function. */ @@ -613,8 +614,16 @@ CTracer_handle_call(CTracer *self, PyFrameObject *frame) SHOWLOG(self->pdata_stack->depth, frame->f_lineno, filename, "skipped"); } +<<<<<<< local self->cur_entry.disposition = disposition; self->cur_entry.last_line = -1; +======= + /* A call event is really a "start frame" event, and can happen for + * 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; +>>>>>>> other ok: ret = RET_OK; @@ -808,9 +817,13 @@ CTracer_handle_return(CTracer *self, PyFrameObject *frame) } if (self->pdata_stack->depth >= 0) { if (self->tracing_arcs && self->cur_entry.file_data) { - int first = frame->f_code->co_firstlineno; - if (CTracer_record_pair(self, self->cur_entry.last_line, -first) < 0) { - goto error; + /* Need to distinguish between RETURN_VALUE and YIELD_VALUE. */ + int bytecode = MyText_AS_STRING(frame->f_code->co_code)[frame->f_lasti]; + if (bytecode != YIELD_VALUE) { + int first = frame->f_code->co_firstlineno; + if (CTracer_record_pair(self, self->cur_entry.last_line, -first) < 0) { + goto error; + } } } |