summaryrefslogtreecommitdiff
path: root/coverage/ctracer
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2017-05-02 13:05:22 -0400
committerNed Batchelder <ned@nedbatchelder.com>2017-05-02 13:05:22 -0400
commit95d4c66f44392a89a2e02637908f5ca0793f2916 (patch)
tree85d86e0439f0649cf80c98f16f32b641ac4f50c3 /coverage/ctracer
parent7f8b0d02855b8886683c6892fe7615c3cdb4fa67 (diff)
downloadpython-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.c7
-rw-r--r--coverage/ctracer/util.h8
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