diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2021-11-22 20:08:29 -0500 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2021-11-24 14:28:00 -0500 |
commit | 753059a2cc923f0037866933dfc2f33e03914600 (patch) | |
tree | b132a978081892cf70a7d7a6347242b12f30ce04 | |
parent | bd6e6852ae76933b6b6971ca7f4a4703e6cd75cb (diff) | |
download | python-coveragepy-git-753059a2cc923f0037866933dfc2f33e03914600.tar.gz |
wip: Py_TPFLAGS_HAVE_GC was suggested. doesn't work yet
-rw-r--r-- | coverage/collector.py | 2 | ||||
-rw-r--r-- | coverage/ctracer/tracer.c | 32 | ||||
-rw-r--r-- | coverage/ctracer/tracer.h | 2 | ||||
-rw-r--r-- | tests/test_oddball.py | 9 |
4 files changed, 29 insertions, 16 deletions
diff --git a/coverage/collector.py b/coverage/collector.py index 1466222d..89ba66ba 100644 --- a/coverage/collector.py +++ b/coverage/collector.py @@ -262,8 +262,6 @@ class Collector: tracer.switch_context = self.switch_context if hasattr(tracer, 'disable_plugin'): tracer.disable_plugin = self.disable_plugin - tracer.another1 = object() - tracer.another2 = self._installation_trace fn = tracer.start() self.tracers.append(tracer) diff --git a/coverage/ctracer/tracer.c b/coverage/ctracer/tracer.c index e8e7e2f3..6e6702dc 100644 --- a/coverage/ctracer/tracer.c +++ b/coverage/ctracer/tracer.c @@ -104,8 +104,6 @@ CTracer_dealloc(CTracer *self) Py_XDECREF(self->switch_context); Py_XDECREF(self->context); Py_XDECREF(self->disable_plugin); - Py_XDECREF(self->another1); - Py_XDECREF(self->another2); DataStack_dealloc(&self->stats, &self->data_stack); if (self->data_stacks) { @@ -120,6 +118,22 @@ CTracer_dealloc(CTracer *self) Py_TYPE(self)->tp_free((PyObject*)self); } +static int +CTracer_traverse(CTracer *self, visitproc visit, void *arg) +{ + Py_VISIT(self->switch_context); + Py_VISIT(self->disable_plugin); + return 0; +} + +static int +CTracer_clear(CTracer *self) +{ + Py_CLEAR(self->switch_context); + Py_CLEAR(self->disable_plugin); + return 0; +} + #if TRACE_LOG static const char * indent(int n) @@ -1023,9 +1037,6 @@ CTracer_members[] = { { "disable_plugin", T_OBJECT, offsetof(CTracer, disable_plugin), 0, PyDoc_STR("Function for disabling a plugin.") }, - { "another1", T_OBJECT, offsetof(CTracer, another1), 0, PyDoc_STR("blah") }, - { "another2", T_OBJECT, offsetof(CTracer, another2), 0, PyDoc_STR("blah") }, - { NULL } }; @@ -1055,7 +1066,8 @@ CTracerType = { "coverage.CTracer", /*tp_name*/ sizeof(CTracer), /*tp_basicsize*/ 0, /*tp_itemsize*/ - (destructor)CTracer_dealloc, /*tp_dealloc*/ + (destructor)CTracer_dealloc, + /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ @@ -1070,10 +1082,12 @@ CTracerType = { 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + /*tp_flags*/ "CTracer objects", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ + (traverseproc)CTracer_traverse, + /* tp_traverse */ + (inquiry)CTracer_clear, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ diff --git a/coverage/ctracer/tracer.h b/coverage/ctracer/tracer.h index 51bd07f9..65d748ca 100644 --- a/coverage/ctracer/tracer.h +++ b/coverage/ctracer/tracer.h @@ -28,8 +28,6 @@ typedef struct CTracer { PyObject * should_start_context; PyObject * switch_context; PyObject * disable_plugin; - PyObject * another1; - PyObject * another2; /* Has the tracer been started? */ BOOL started; diff --git a/tests/test_oddball.py b/tests/test_oddball.py index 7f65e827..e1f12978 100644 --- a/tests/test_oddball.py +++ b/tests/test_oddball.py @@ -217,7 +217,6 @@ class MemoryLeakTest(CoverageTest): for i in range(3): work() gc_collect() - n.append(len(gc.get_objects())) objs = gc.get_objects() n.append(len(objs)) for obj in objs: @@ -225,8 +224,12 @@ class MemoryLeakTest(CoverageTest): meths[i][id(obj)] = obj del objs - print("diff 0-1", [meths[1][k] for k in set(meths[1]) - set(meths[0])]) - print("diff 1-2", [meths[2][k] for k in set(meths[2]) - set(meths[1])]) + import pprint + print("diff 0-1:") + pprint.pprint([meths[1][k] for k in set(meths[1]) - set(meths[0])]) + print("diff 1-2:") + pprint.pprint([meths[2][k] for k in set(meths[2]) - set(meths[1])]) + print(f"gc.garbage has {len(gc.garbage)} things") assert ( n[0] == n[1] == n[2] ), f"objects leaked: {n[1] - n[0]}, {n[2] - n[1]}" |