diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2017-05-02 13:05:22 -0400 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2017-05-02 13:05:22 -0400 |
commit | 95d4c66f44392a89a2e02637908f5ca0793f2916 (patch) | |
tree | 85d86e0439f0649cf80c98f16f32b641ac4f50c3 /coverage/ctracer | |
parent | 7f8b0d02855b8886683c6892fe7615c3cdb4fa67 (diff) | |
download | python-coveragepy-git-95d4c66f44392a89a2e02637908f5ca0793f2916.tar.gz |
Properly round-trip the trace function even when not measuring coverage. #575
Diffstat (limited to 'coverage/ctracer')
-rw-r--r-- | coverage/ctracer/tracer.c | 7 | ||||
-rw-r--r-- | coverage/ctracer/util.h | 8 |
2 files changed, 12 insertions, 3 deletions
diff --git a/coverage/ctracer/tracer.c b/coverage/ctracer/tracer.c index ee112d83..095df11a 100644 --- a/coverage/ctracer/tracer.c +++ b/coverage/ctracer/tracer.c @@ -529,9 +529,6 @@ CTracer_handle_call(CTracer *self, PyFrameObject *frame) self->pcur_entry->file_data = file_data; self->pcur_entry->file_tracer = file_tracer; - /* Make the frame right in case settrace(gettrace()) happens. */ - Py_INCREF(self); - frame->f_trace = (PyObject*)self; SHOWLOG(self->pdata_stack->depth, frame->f_lineno, filename, "traced"); } else { @@ -543,6 +540,10 @@ CTracer_handle_call(CTracer *self, PyFrameObject *frame) self->pcur_entry->disposition = disposition; + /* Make the frame right in case settrace(gettrace()) happens. */ + Py_INCREF(self); + My_XSETREF(frame->f_trace, (PyObject*)self); + /* 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. diff --git a/coverage/ctracer/util.h b/coverage/ctracer/util.h index e192f977..f0c302cf 100644 --- a/coverage/ctracer/util.h +++ b/coverage/ctracer/util.h @@ -44,6 +44,14 @@ #endif /* Py3k */ +// Undocumented, and not in 2.6, so our own copy of it. +#define My_XSETREF(op, op2) \ + do { \ + PyObject *_py_tmp = (PyObject *)(op); \ + (op) = (op2); \ + Py_XDECREF(_py_tmp); \ + } while (0) + /* The values returned to indicate ok or error. */ #define RET_OK 0 #define RET_ERROR -1 |