From 10286f307f2b242c6246db8cfe9cb401b1fb6b7e Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 8 Dec 2015 12:20:50 -0800 Subject: [PATCH] Pass reference to parser in stack's tree selection callback --- spec/runtime/stack_spec.cc | 4 +++- src/runtime/parser.c | 7 ++++--- src/runtime/stack.c | 12 ++++++++++-- src/runtime/stack.h | 6 ++++-- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/spec/runtime/stack_spec.cc b/spec/runtime/stack_spec.cc index db075700..8b083707 100644 --- a/spec/runtime/stack_spec.cc +++ b/spec/runtime/stack_spec.cc @@ -43,7 +43,9 @@ describe("Stack", [&]() { TSSymbolMetadata metadata = {true, true, true}; before_each([&]() { - stack = ts_stack_new({ + stack = ts_stack_new(); + + ts_stack_set_tree_selection_callback(stack, { &tree_selection_spy, tree_selection_spy_callback }); diff --git a/src/runtime/parser.c b/src/runtime/parser.c index 27097b7e..570da2aa 100644 --- a/src/runtime/parser.c +++ b/src/runtime/parser.c @@ -433,6 +433,9 @@ static void ts_parser__start(TSParser *self, TSInput input, ts_lexer_set_input(&self->lexer, input); ts_stack_clear(self->stack); + ts_stack_set_tree_selection_callback(self->stack, (TreeSelectionCallback){ + self, ts_parser__select_tree, + }); LookaheadState lookahead_state = { .reusable_subtree = previous_tree, @@ -582,9 +585,7 @@ static ConsumeResult ts_parser__consume_lookahead(TSParser *self, int head, TSParser ts_parser_make() { return (TSParser){ .lexer = ts_lexer_make(), - .stack = ts_stack_new((TreeSelectionCallback){ - NULL, ts_parser__select_tree, - }), + .stack = ts_stack_new(), .lookahead_states = vector_new(sizeof(LookaheadState), 4), .reduce_parents = vector_new(sizeof(TSTree *), 4), }; diff --git a/src/runtime/stack.c b/src/runtime/stack.c index 1eccfd97..45219b6b 100644 --- a/src/runtime/stack.c +++ b/src/runtime/stack.c @@ -36,13 +36,17 @@ typedef struct { * Section: Stack lifecycle */ -Stack *ts_stack_new(TreeSelectionCallback tree_selection_callback) { +static TSTree *ts_stack__default_tree_selection(void *p, TSTree *t1, TSTree *t2) { + return t1; +} + +Stack *ts_stack_new() { Stack *self = malloc(sizeof(Stack)); *self = (Stack){ .heads = calloc(INITIAL_HEAD_CAPACITY, sizeof(StackNode *)), .head_count = 1, .head_capacity = INITIAL_HEAD_CAPACITY, - .tree_selection_callback = tree_selection_callback, + .tree_selection_callback = {NULL, ts_stack__default_tree_selection}, .pop_results = vector_new(sizeof(StackPopResult), 4), .pop_paths = vector_new(sizeof(PopPath), 4), }; @@ -351,3 +355,7 @@ void ts_stack_clear(Stack *self) { self->head_count = 1; self->heads[0] = NULL; } + +void ts_stack_set_tree_selection_callback(Stack *self, TreeSelectionCallback callback) { + self->tree_selection_callback = callback; +} diff --git a/src/runtime/stack.h b/src/runtime/stack.h index 6c37864e..0823dc42 100644 --- a/src/runtime/stack.h +++ b/src/runtime/stack.h @@ -24,13 +24,13 @@ typedef struct { typedef struct { void *data; - TSTree *(*callback)(void *data, TSTree *, TSTree *); + TSTree *(*callback)(void *, TSTree *, TSTree *); } TreeSelectionCallback; /* * Create a parse stack. */ -Stack *ts_stack_new(TreeSelectionCallback); +Stack *ts_stack_new(); /* * Release any resources reserved by a parse stack. @@ -117,6 +117,8 @@ void ts_stack_remove_head(Stack *, int head); */ void ts_stack_clear(Stack *); +void ts_stack_set_tree_selection_callback(Stack *, TreeSelectionCallback); + #ifdef __cplusplus } #endif