summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2021-11-23 12:41:12 -0500
committerNed Batchelder <ned@nedbatchelder.com>2021-11-24 14:28:00 -0500
commite3696d623d81d46997b4cbd5d417bbd057d5edc5 (patch)
tree5af34b84c3d921fa984cc35c2e227f088dd71a82
parent753059a2cc923f0037866933dfc2f33e03914600 (diff)
downloadpython-coveragepy-git-e3696d623d81d46997b4cbd5d417bbd057d5edc5.tar.gz
traverse and clear work on everything. still leaks
[skip actions]
-rw-r--r--coverage/ctracer/datastack.c20
-rw-r--r--coverage/ctracer/datastack.h2
-rw-r--r--coverage/ctracer/tracer.c50
3 files changed, 71 insertions, 1 deletions
diff --git a/coverage/ctracer/datastack.c b/coverage/ctracer/datastack.c
index a9cfcc2c..6bd91460 100644
--- a/coverage/ctracer/datastack.c
+++ b/coverage/ctracer/datastack.c
@@ -19,7 +19,6 @@ void
DataStack_dealloc(Stats *pstats, DataStack *pdata_stack)
{
int i;
-
for (i = 0; i < pdata_stack->alloc; i++) {
Py_XDECREF(pdata_stack->stack[i].file_data);
}
@@ -27,6 +26,25 @@ DataStack_dealloc(Stats *pstats, DataStack *pdata_stack)
}
int
+DataStack_traverse(DataStack *pdata_stack, visitproc visit, void *arg)
+{
+ int i;
+ for (i = 0; i < pdata_stack->alloc; i++) {
+ Py_VISIT(pdata_stack->stack[i].file_data);
+ }
+ return 0;
+}
+
+void
+DataStack_clear(DataStack *pdata_stack)
+{
+ int i;
+ for (i = 0; i < pdata_stack->alloc; i++) {
+ Py_CLEAR(pdata_stack->stack[i].file_data);
+ }
+}
+
+int
DataStack_grow(Stats *pstats, DataStack *pdata_stack)
{
pdata_stack->depth++;
diff --git a/coverage/ctracer/datastack.h b/coverage/ctracer/datastack.h
index c383e1e1..e023050b 100644
--- a/coverage/ctracer/datastack.h
+++ b/coverage/ctracer/datastack.h
@@ -40,6 +40,8 @@ typedef struct DataStack {
int DataStack_init(Stats * pstats, DataStack *pdata_stack);
void DataStack_dealloc(Stats * pstats, DataStack *pdata_stack);
+int DataStack_traverse(DataStack *pdata_stack, visitproc visit, void *arg);
+void DataStack_clear(DataStack *pdata_stack);
int DataStack_grow(Stats * pstats, DataStack *pdata_stack);
#endif /* _COVERAGE_DATASTACK_H */
diff --git a/coverage/ctracer/tracer.c b/coverage/ctracer/tracer.c
index 6e6702dc..839c470b 100644
--- a/coverage/ctracer/tracer.c
+++ b/coverage/ctracer/tracer.c
@@ -121,16 +121,66 @@ CTracer_dealloc(CTracer *self)
static int
CTracer_traverse(CTracer *self, visitproc visit, void *arg)
{
+ int i;
+ int tret;
+
Py_VISIT(self->switch_context);
Py_VISIT(self->disable_plugin);
+ Py_VISIT(self->should_trace);
+ Py_VISIT(self->check_include);
+ Py_VISIT(self->warn);
+ Py_VISIT(self->concur_id_func);
+ Py_VISIT(self->data);
+ Py_VISIT(self->file_tracers);
+ Py_VISIT(self->should_trace_cache);
+ Py_VISIT(self->trace_arcs);
+ Py_VISIT(self->should_start_context);
+ Py_VISIT(self->context);
+ Py_VISIT(self->data_stack_index);
+
+ tret = DataStack_traverse(&self->data_stack, visit, arg);
+ if (tret) {
+ return tret;
+ }
+
+ if (self->data_stacks) {
+ for (i = 0; i < self->data_stacks_used; i++) {
+ tret = DataStack_traverse(self->data_stacks + i, visit, arg);
+ if (tret) {
+ return tret;
+ }
+ }
+ }
+
return 0;
}
static int
CTracer_clear(CTracer *self)
{
+ int i;
+
Py_CLEAR(self->switch_context);
Py_CLEAR(self->disable_plugin);
+ Py_CLEAR(self->should_trace);
+ Py_CLEAR(self->check_include);
+ Py_CLEAR(self->warn);
+ Py_CLEAR(self->concur_id_func);
+ Py_CLEAR(self->data);
+ Py_CLEAR(self->file_tracers);
+ Py_CLEAR(self->should_trace_cache);
+ Py_CLEAR(self->trace_arcs);
+ Py_CLEAR(self->should_start_context);
+ Py_CLEAR(self->context);
+ Py_CLEAR(self->data_stack_index);
+
+ DataStack_clear(&self->data_stack);
+ if (self->data_stacks) {
+ for (i = 0; i < self->data_stacks_used; i++) {
+ DataStack_clear(self->data_stacks + i);
+ }
+ }
+
return 0;
}