summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/treesit.c24
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)))