summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2021-11-22 20:08:29 -0500
committerNed Batchelder <ned@nedbatchelder.com>2021-11-24 14:28:00 -0500
commit753059a2cc923f0037866933dfc2f33e03914600 (patch)
treeb132a978081892cf70a7d7a6347242b12f30ce04
parentbd6e6852ae76933b6b6971ca7f4a4703e6cd75cb (diff)
downloadpython-coveragepy-git-753059a2cc923f0037866933dfc2f33e03914600.tar.gz
wip: Py_TPFLAGS_HAVE_GC was suggested. doesn't work yet
-rw-r--r--coverage/collector.py2
-rw-r--r--coverage/ctracer/tracer.c32
-rw-r--r--coverage/ctracer/tracer.h2
-rw-r--r--tests/test_oddball.py9
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]}"