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
commit31c8dbfcf45cd6bbb0f7d47c5b0e69d5948c122c (patch)
treee665beaeefee3fea44d380e38274f7b379a203ea /coverage/ctracer/datastack.c
parent65a9b1a16c9b1c38e890213ff7008416cc915158 (diff)
downloadpython-coveragepy-31c8dbfcf45cd6bbb0f7d47c5b0e69d5948c122c.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 5a384e6..515ba92 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;
}