From dfd7b1f5f67b788ef9c137717b8ac4cccdcaf13b Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 27 Jun 2017 16:01:07 -0700 Subject: [PATCH] Consolidate memory management logic in Stack --- src/runtime/stack.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/runtime/stack.c b/src/runtime/stack.c index a8fafa43..55a124d6 100644 --- a/src/runtime/stack.c +++ b/src/runtime/stack.c @@ -171,6 +171,11 @@ static void stack_node_add_link(StackNode *self, StackLink link) { } } +static void stack_head_delete(StackHead *self, StackNodeArray *pool) { + if (self->last_external_token) ts_tree_release(self->last_external_token); + stack_node_release(self->node, pool); +} + static StackVersion ts_stack__add_version(Stack *self, StackNode *node, unsigned push_count, Tree *last_external_token) { @@ -317,9 +322,7 @@ void ts_stack_delete(Stack *self) { array_delete(&self->iterators); stack_node_release(self->base_node, &self->node_pool); for (uint32_t i = 0; i < self->heads.size; i++) { - StackHead head = self->heads.contents[i]; - stack_node_release(head.node, &self->node_pool); - if (head.last_external_token) ts_tree_release(head.last_external_token); + stack_head_delete(&self->heads.contents[i], &self->node_pool); } array_clear(&self->heads); if (self->node_pool.contents) { @@ -482,18 +485,14 @@ StackPopResult ts_stack_pop_all(Stack *self, StackVersion version) { } void ts_stack_remove_version(Stack *self, StackVersion version) { - StackHead *head = array_get(&self->heads, version); - if (head->last_external_token) ts_tree_release(head->last_external_token); - stack_node_release(head->node, &self->node_pool); + stack_head_delete(array_get(&self->heads, version), &self->node_pool); array_erase(&self->heads, version); } void ts_stack_renumber_version(Stack *self, StackVersion v1, StackVersion v2) { assert(v2 < v1); assert((uint32_t)v1 < self->heads.size); - StackHead *head_to_remove = &self->heads.contents[v2]; - stack_node_release(head_to_remove->node, &self->node_pool); - if (head_to_remove->last_external_token) ts_tree_release(head_to_remove->last_external_token); + stack_head_delete(&self->heads.contents[v2], &self->node_pool); self->heads.contents[v2] = self->heads.contents[v1]; array_erase(&self->heads, v1); } @@ -540,9 +539,7 @@ bool ts_stack_is_halted(Stack *self, StackVersion version) { void ts_stack_clear(Stack *self) { stack_node_retain(self->base_node); for (uint32_t i = 0; i < self->heads.size; i++) { - StackHead head = self->heads.contents[i]; - stack_node_release(head.node, &self->node_pool); - if (head.last_external_token) ts_tree_release(head.last_external_token); + stack_head_delete(&self->heads.contents[i], &self->node_pool); } array_clear(&self->heads); array_push(&self->heads, ((StackHead){