diff --git a/src/runtime/parser.c b/src/runtime/parser.c index 265354a2..ff194936 100644 --- a/src/runtime/parser.c +++ b/src/runtime/parser.c @@ -396,8 +396,7 @@ static void parser__set_cached_token(Parser *self, size_t byte_index, Tree *last } static bool parser__can_reuse_first_leaf(Parser *self, TSStateId state, Tree *tree, - TableEntry *table_entry, - ReusableNode *next_reusable_node) { + TableEntry *table_entry) { TSLexMode current_lex_mode = self->language->lex_modes[state]; // If the token was created in a state with the same set of lookaheads, it is reusable. @@ -462,14 +461,13 @@ static Tree *parser__get_lookahead(Parser *self, StackVersion version, TSStateId } ts_language_table_entry(self->language, *state, result->first_leaf.symbol, table_entry); - ReusableNode next_reusable_node = reusable_node_after_leaf(reusable_node); - if (!parser__can_reuse_first_leaf(self, *state, result, table_entry, &next_reusable_node)) { + if (!parser__can_reuse_first_leaf(self, *state, result, table_entry)) { LOG( "cant_reuse_node symbol:%s, first_leaf_symbol:%s", SYM_NAME(result->symbol), SYM_NAME(result->first_leaf.symbol) ); - *reusable_node = next_reusable_node; + reusable_node_pop_leaf(reusable_node); break; } @@ -480,7 +478,7 @@ static Tree *parser__get_lookahead(Parser *self, StackVersion version, TSStateId if ((result = parser__get_cached_token(self, position.bytes, last_external_token))) { ts_language_table_entry(self->language, *state, result->first_leaf.symbol, table_entry); - if (parser__can_reuse_first_leaf(self, *state, result, table_entry, NULL)) { + if (parser__can_reuse_first_leaf(self, *state, result, table_entry)) { ts_tree_retain(result); return result; } diff --git a/src/runtime/reusable_node.h b/src/runtime/reusable_node.h index 04b9af7e..4a6290f4 100644 --- a/src/runtime/reusable_node.h +++ b/src/runtime/reusable_node.h @@ -28,12 +28,11 @@ static inline void reusable_node_pop(ReusableNode *self) { } } -static inline ReusableNode reusable_node_after_leaf(const ReusableNode *self) { - ReusableNode result = *self; - while (result.tree->children.size > 0) - result.tree = result.tree->children.contents[0]; - reusable_node_pop(&result); - return result; +static inline void reusable_node_pop_leaf(ReusableNode *self) { + while (self->tree->children.size > 0) { + self->tree = self->tree->children.contents[0]; + } + reusable_node_pop(self); } static inline bool reusable_node_breakdown(ReusableNode *self) {