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, | |||
| 3247 | } | 3247 | } |
| 3248 | } | 3248 | } |
| 3249 | 3249 | ||
| 3250 | /** Cleanup function for cursor. */ | ||
| 3251 | static void treesit_traverse_cleanup_cursor(void *cursor) | ||
| 3252 | { | ||
| 3253 | ts_tree_cursor_delete ((TSTreeCursor *) cursor); | ||
| 3254 | } | ||
| 3255 | |||
| 3250 | DEFUN ("treesit-search-subtree", | 3256 | DEFUN ("treesit-search-subtree", |
| 3251 | Ftreesit_search_subtree, | 3257 | Ftreesit_search_subtree, |
| 3252 | Streesit_search_subtree, 2, 5, 0, | 3258 | Streesit_search_subtree, 2, 5, 0, |
| @@ -3288,12 +3294,18 @@ Return the first matched node, or nil if none matches. */) | |||
| 3288 | if (!treesit_cursor_helper (&cursor, XTS_NODE (node)->node, parser)) | 3294 | if (!treesit_cursor_helper (&cursor, XTS_NODE (node)->node, parser)) |
| 3289 | return return_value; | 3295 | return return_value; |
| 3290 | 3296 | ||
| 3297 | specpdl_ref count = SPECPDL_INDEX (); | ||
| 3298 | record_unwind_protect_ptr (treesit_traverse_cleanup_cursor, &cursor); | ||
| 3299 | |||
| 3291 | if (treesit_search_dfs (&cursor, predicate, parser, NILP (backward), | 3300 | if (treesit_search_dfs (&cursor, predicate, parser, NILP (backward), |
| 3292 | NILP (all), the_limit, false)) | 3301 | NILP (all), the_limit, false)) |
| 3293 | { | 3302 | { |
| 3294 | TSNode node = ts_tree_cursor_current_node (&cursor); | 3303 | TSNode node = ts_tree_cursor_current_node (&cursor); |
| 3295 | return_value = make_treesit_node (parser, node); | 3304 | return_value = make_treesit_node (parser, node); |
| 3296 | } | 3305 | } |
| 3306 | |||
| 3307 | unbind_to (count, Qnil); | ||
| 3308 | |||
| 3297 | ts_tree_cursor_delete (&cursor); | 3309 | ts_tree_cursor_delete (&cursor); |
| 3298 | return return_value; | 3310 | return return_value; |
| 3299 | } | 3311 | } |
| @@ -3345,12 +3357,18 @@ always traverse leaf nodes first, then upwards. */) | |||
| 3345 | if (!treesit_cursor_helper (&cursor, XTS_NODE (start)->node, parser)) | 3357 | if (!treesit_cursor_helper (&cursor, XTS_NODE (start)->node, parser)) |
| 3346 | return return_value; | 3358 | return return_value; |
| 3347 | 3359 | ||
| 3360 | specpdl_ref count = SPECPDL_INDEX (); | ||
| 3361 | record_unwind_protect_ptr (treesit_traverse_cleanup_cursor, &cursor); | ||
| 3362 | |||
| 3348 | if (treesit_search_forward (&cursor, predicate, parser, | 3363 | if (treesit_search_forward (&cursor, predicate, parser, |
| 3349 | NILP (backward), NILP (all))) | 3364 | NILP (backward), NILP (all))) |
| 3350 | { | 3365 | { |
| 3351 | TSNode node = ts_tree_cursor_current_node (&cursor); | 3366 | TSNode node = ts_tree_cursor_current_node (&cursor); |
| 3352 | return_value = make_treesit_node (parser, node); | 3367 | return_value = make_treesit_node (parser, node); |
| 3353 | } | 3368 | } |
| 3369 | |||
| 3370 | unbind_to (count, Qnil); | ||
| 3371 | |||
| 3354 | ts_tree_cursor_delete (&cursor); | 3372 | ts_tree_cursor_delete (&cursor); |
| 3355 | return return_value; | 3373 | return return_value; |
| 3356 | } | 3374 | } |
| @@ -3467,8 +3485,14 @@ a regexp. */) | |||
| 3467 | to use treesit_cursor_helper. */ | 3485 | to use treesit_cursor_helper. */ |
| 3468 | TSTreeCursor cursor = ts_tree_cursor_new (XTS_NODE (root)->node); | 3486 | TSTreeCursor cursor = ts_tree_cursor_new (XTS_NODE (root)->node); |
| 3469 | 3487 | ||
| 3488 | specpdl_ref count = SPECPDL_INDEX (); | ||
| 3489 | record_unwind_protect_ptr (treesit_traverse_cleanup_cursor, &cursor); | ||
| 3490 | |||
| 3470 | treesit_build_sparse_tree (&cursor, parent, predicate, process_fn, | 3491 | treesit_build_sparse_tree (&cursor, parent, predicate, process_fn, |
| 3471 | the_limit, parser); | 3492 | the_limit, parser); |
| 3493 | |||
| 3494 | unbind_to (count, Qnil); | ||
| 3495 | |||
| 3472 | ts_tree_cursor_delete (&cursor); | 3496 | ts_tree_cursor_delete (&cursor); |
| 3473 | Fsetcdr (parent, Fnreverse (Fcdr (parent))); | 3497 | Fsetcdr (parent, Fnreverse (Fcdr (parent))); |
| 3474 | if (NILP (Fcdr (parent))) | 3498 | if (NILP (Fcdr (parent))) |