From e99a3925e0f62d6d699544bb973fa8604c9d2dc8 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Sun, 24 Apr 2016 00:55:19 -0700 Subject: [PATCH] Merge all versions created in a given reduce operation --- src/runtime/parser.c | 3 +++ src/runtime/stack.c | 10 +++++++--- src/runtime/stack.h | 2 ++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/runtime/parser.c b/src/runtime/parser.c index 17411929..b7c0848d 100644 --- a/src/runtime/parser.c +++ b/src/runtime/parser.c @@ -342,6 +342,7 @@ static Reduction ts_parser__reduce(TSParser *self, StackVersion version, count, BOOL_STRING(fragile)); } + size_t initial_version_count = ts_stack_version_count(self->stack); StackPopResult pop = ts_stack_pop_count(self->stack, version, count); switch (pop.status) { case StackPopFailed: @@ -414,6 +415,8 @@ static Reduction ts_parser__reduce(TSParser *self, StackVersion version, } } + ts_stack_merge_from(self->stack, initial_version_count); + return (Reduction){ ReduceSucceeded, pop.slices.contents[0] }; error: diff --git a/src/runtime/stack.c b/src/runtime/stack.c index d780e9e1..56af6de3 100644 --- a/src/runtime/stack.c +++ b/src/runtime/stack.c @@ -401,10 +401,10 @@ void ts_stack_renumber_version(Stack *self, StackVersion v1, StackVersion v2) { array_erase(&self->heads, v1); } -void ts_stack_merge(Stack *self) { - for (size_t i = 0; i < self->heads.size; i++) { +void ts_stack_merge_from(Stack *self, StackVersion start_version) { + for (size_t i = start_version + 1; i < self->heads.size; i++) { StackNode *node = self->heads.contents[i]; - for (size_t j = 0; j < i; j++) { + for (size_t j = start_version; j < i; j++) { StackNode *prior_node = self->heads.contents[j]; if (prior_node->state == node->state && prior_node->position.chars == node->position.chars) { @@ -419,6 +419,10 @@ void ts_stack_merge(Stack *self) { } } +void ts_stack_merge(Stack *self) { + ts_stack_merge_from(self, 0); +} + void ts_stack_clear(Stack *self) { stack_node_retain(self->base_node); for (size_t i = 0; i < self->heads.size; i++) diff --git a/src/runtime/stack.h b/src/runtime/stack.h index bf95cc2d..d5761650 100644 --- a/src/runtime/stack.h +++ b/src/runtime/stack.h @@ -94,6 +94,8 @@ StackPopResult ts_stack_pop_pending(Stack *, StackVersion); StackPopResult ts_stack_pop_all(Stack *, StackVersion); +void ts_stack_merge_from(Stack *, StackVersion); + void ts_stack_merge(Stack *); void ts_stack_renumber_version(Stack *, StackVersion, StackVersion);