diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/treesit.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/treesit.c b/src/treesit.c index fd5fda78133..76d1dc8ccf4 100644 --- a/src/treesit.c +++ b/src/treesit.c @@ -3247,6 +3247,12 @@ treesit_search_forward (TSTreeCursor *cursor, } } +/** Cleanup function for cursor. */ +static void treesit_traverse_cleanup_cursor(void *cursor) +{ + ts_tree_cursor_delete ((TSTreeCursor *) cursor); +} + DEFUN ("treesit-search-subtree", Ftreesit_search_subtree, Streesit_search_subtree, 2, 5, 0, @@ -3288,12 +3294,18 @@ Return the first matched node, or nil if none matches. */) if (!treesit_cursor_helper (&cursor, XTS_NODE (node)->node, parser)) return return_value; + specpdl_ref count = SPECPDL_INDEX (); + record_unwind_protect_ptr (treesit_traverse_cleanup_cursor, &cursor); + if (treesit_search_dfs (&cursor, predicate, parser, NILP (backward), NILP (all), the_limit, false)) { TSNode node = ts_tree_cursor_current_node (&cursor); return_value = make_treesit_node (parser, node); } + + unbind_to (count, Qnil); + ts_tree_cursor_delete (&cursor); return return_value; } @@ -3345,12 +3357,18 @@ always traverse leaf nodes first, then upwards. */) if (!treesit_cursor_helper (&cursor, XTS_NODE (start)->node, parser)) return return_value; + specpdl_ref count = SPECPDL_INDEX (); + record_unwind_protect_ptr (treesit_traverse_cleanup_cursor, &cursor); + if (treesit_search_forward (&cursor, predicate, parser, NILP (backward), NILP (all))) { TSNode node = ts_tree_cursor_current_node (&cursor); return_value = make_treesit_node (parser, node); } + + unbind_to (count, Qnil); + ts_tree_cursor_delete (&cursor); return return_value; } @@ -3467,8 +3485,14 @@ a regexp. */) to use treesit_cursor_helper. */ TSTreeCursor cursor = ts_tree_cursor_new (XTS_NODE (root)->node); + specpdl_ref count = SPECPDL_INDEX (); + record_unwind_protect_ptr (treesit_traverse_cleanup_cursor, &cursor); + treesit_build_sparse_tree (&cursor, parent, predicate, process_fn, the_limit, parser); + + unbind_to (count, Qnil); + ts_tree_cursor_delete (&cursor); Fsetcdr (parent, Fnreverse (Fcdr (parent))); if (NILP (Fcdr (parent))) |