diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2021-11-23 12:41:12 -0500 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2021-11-24 14:28:00 -0500 |
commit | e3696d623d81d46997b4cbd5d417bbd057d5edc5 (patch) | |
tree | 5af34b84c3d921fa984cc35c2e227f088dd71a82 | |
parent | 753059a2cc923f0037866933dfc2f33e03914600 (diff) | |
download | python-coveragepy-git-e3696d623d81d46997b4cbd5d417bbd057d5edc5.tar.gz |
traverse and clear work on everything. still leaks
[skip actions]
-rw-r--r-- | coverage/ctracer/datastack.c | 20 | ||||
-rw-r--r-- | coverage/ctracer/datastack.h | 2 | ||||
-rw-r--r-- | coverage/ctracer/tracer.c | 50 |
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; } |