summaryrefslogtreecommitdiff
path: root/coverage/ctracer/datastack.c
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2017-03-03 06:56:21 -0500
committerNed Batchelder <ned@nedbatchelder.com>2017-03-03 06:56:21 -0500
commit68fb56eb803283f7df9caf2d47c0d39e7be95cbb (patch)
treedd473a0ae57e68589de94e267a898b7d299e6226 /coverage/ctracer/datastack.c
parent0c38af32a0cada8d35671adff86c871d3badb37a (diff)
downloadpython-coveragepy-git-68fb56eb803283f7df9caf2d47c0d39e7be95cbb.tar.gz
Simplify stack management in CTracer
"file_data" used to be borrowed from data, but that was confusing. Now it's owned. We used to have a struct member which was a copy of the current stack entry. That just made it harder to reason about reference counting. Now we have a pointer to the entry on the stack.
Diffstat (limited to 'coverage/ctracer/datastack.c')
-rw-r--r--coverage/ctracer/datastack.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/coverage/ctracer/datastack.c b/coverage/ctracer/datastack.c
index 5a384e6b..515ba924 100644
--- a/coverage/ctracer/datastack.c
+++ b/coverage/ctracer/datastack.c
@@ -4,7 +4,7 @@
#include "util.h"
#include "datastack.h"
-#define STACK_DELTA 100
+#define STACK_DELTA 20
int
DataStack_init(Stats *pstats, DataStack *pdata_stack)
@@ -18,6 +18,11 @@ DataStack_init(Stats *pstats, DataStack *pdata_stack)
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);
+ }
PyMem_Free(pdata_stack->stack);
}
@@ -35,6 +40,9 @@ DataStack_grow(Stats *pstats, DataStack *pdata_stack)
pdata_stack->depth--;
return RET_ERROR;
}
+ /* Zero the new entries. */
+ memset(bigger_data_stack + pdata_stack->alloc, 0, STACK_DELTA * sizeof(DataStackEntry));
+
pdata_stack->stack = bigger_data_stack;
pdata_stack->alloc = bigger;
}