aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGerd Möllmann2022-09-28 16:30:34 +0200
committerGerd Möllmann2022-09-28 16:30:34 +0200
commit498d331b07117408c5c5d8a3889b49b275b9a654 (patch)
tree645d97f0bd0b9e310b6257b515d14026071d04bd /src
parent8173a292e7366beff0279480cbd2f73bf2357568 (diff)
downloademacs-498d331b07117408c5c5d8a3889b49b275b9a654.tar.gz
emacs-498d331b07117408c5c5d8a3889b49b275b9a654.zip
Add debugging help for nested iterators (nug#58144)
When starting an iteration, store __FILE__ and __LINE__ where this happens in the interval_tree structure. * src/buffer.h (buffer_overlay_iter_start): New macro adding __FILE and __LINE__. (buffer_overlay_iter_start1): Renamed from ..._start. * src/itree.h (struct interval_tree): Add file and line info. * src/itree.c: (interval_tree_contains, interval_tree_nodes, interval_tree_insert_gap): Pass __FILE__ and __LINE__ to iter_start. (interval_tree_iter_start): Record file and line info in tree.
Diffstat (limited to 'src')
-rw-r--r--src/buffer.h9
-rw-r--r--src/itree.c11
-rw-r--r--src/itree.h5
3 files changed, 17 insertions, 8 deletions
diff --git a/src/buffer.h b/src/buffer.h
index 7d6c693b0f2..097283be671 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -1457,13 +1457,16 @@ remove_buffer_overlay (struct buffer *b, struct Lisp_Overlay *ov)
1457} 1457}
1458 1458
1459INLINE void 1459INLINE void
1460buffer_overlay_iter_start (struct buffer *b, ptrdiff_t begin, ptrdiff_t end, 1460buffer_overlay_iter_start1 (struct buffer *b, ptrdiff_t begin, ptrdiff_t end,
1461 enum interval_tree_order order) 1461 enum interval_tree_order order, const char* file, int line)
1462{ 1462{
1463 if (b->overlays) 1463 if (b->overlays)
1464 interval_tree_iter_start (b->overlays, begin, end, order); 1464 interval_tree_iter_start (b->overlays, begin, end, order, file, line);
1465} 1465}
1466 1466
1467#define buffer_overlay_iter_start(b, begin, end, order) \
1468 buffer_overlay_iter_start1 ((b), (begin), (end), (order), __FILE__, __LINE__)
1469
1467INLINE struct interval_node* 1470INLINE struct interval_node*
1468buffer_overlay_iter_next (struct buffer *b) 1471buffer_overlay_iter_next (struct buffer *b)
1469{ 1472{
diff --git a/src/itree.c b/src/itree.c
index a6439970626..e31ce39ba11 100644
--- a/src/itree.c
+++ b/src/itree.c
@@ -328,7 +328,7 @@ interval_tree_contains (struct interval_tree *tree, struct interval_node *node)
328{ 328{
329 struct interval_node *other; 329 struct interval_node *other;
330 330
331 interval_tree_iter_start (tree, node->begin, PTRDIFF_MAX, ITREE_ASCENDING); 331 interval_tree_iter_start (tree, node->begin, PTRDIFF_MAX, ITREE_ASCENDING, __FILE__, __LINE__);
332 while ((other = interval_tree_iter_next (tree))) 332 while ((other = interval_tree_iter_next (tree)))
333 if (other == node) 333 if (other == node)
334 break; 334 break;
@@ -417,7 +417,7 @@ interval_tree_nodes (struct interval_tree *tree,
417{ 417{
418 struct interval_node *node; 418 struct interval_node *node;
419 419
420 interval_tree_iter_start (tree, PTRDIFF_MIN, PTRDIFF_MAX, order); 420 interval_tree_iter_start (tree, PTRDIFF_MIN, PTRDIFF_MAX, order, __FILE__, __LINE__);
421 while ((node = interval_tree_iter_next (tree))) 421 while ((node = interval_tree_iter_next (tree)))
422 { 422 {
423 *nodes = node; 423 *nodes = node;
@@ -434,12 +434,15 @@ interval_tree_nodes (struct interval_tree *tree,
434void 434void
435interval_tree_iter_start (struct interval_tree *tree, 435interval_tree_iter_start (struct interval_tree *tree,
436 ptrdiff_t begin, ptrdiff_t end, 436 ptrdiff_t begin, ptrdiff_t end,
437 enum interval_tree_order order) 437 enum interval_tree_order order,
438 const char* file, int line)
438{ 439{
439 if (tree->iter_running) 440 if (tree->iter_running)
440 emacs_abort (); 441 emacs_abort ();
441 interval_generator_reset (tree->iter, begin, end, order); 442 interval_generator_reset (tree->iter, begin, end, order);
442 tree->iter_running = 1; 443 tree->iter_running = 1;
444 tree->file = file;
445 tree->line = line;
443} 446}
444 447
445/* Limit the search interval of the iterator to the given values. The 448/* Limit the search interval of the iterator to the given values. The
@@ -511,7 +514,7 @@ interval_tree_insert_gap (struct interval_tree *tree, ptrdiff_t pos, ptrdiff_t l
511 order, so we need to remove them first. */ 514 order, so we need to remove them first. */
512 struct interval_stack *saved = interval_stack_create (0); 515 struct interval_stack *saved = interval_stack_create (0);
513 struct interval_node *node = NULL; 516 struct interval_node *node = NULL;
514 interval_tree_iter_start (tree, pos, pos + 1, ITREE_PRE_ORDER); 517 interval_tree_iter_start (tree, pos, pos + 1, ITREE_PRE_ORDER, __FILE__, __LINE__);
515 while ((node = interval_tree_iter_next (tree))) 518 while ((node = interval_tree_iter_next (tree)))
516 { 519 {
517 if (node->begin == pos && node->front_advance 520 if (node->begin == pos && node->front_advance
diff --git a/src/itree.h b/src/itree.h
index 21d8b21a02f..e5d68fbfabb 100644
--- a/src/itree.h
+++ b/src/itree.h
@@ -59,6 +59,8 @@ struct interval_tree
59 intmax_t size; /* Number of nodes in the tree. */ 59 intmax_t size; /* Number of nodes in the tree. */
60 struct interval_generator *iter; 60 struct interval_generator *iter;
61 bool_bf iter_running : 1; 61 bool_bf iter_running : 1;
62 const char* file;
63 int line;
62}; 64};
63 65
64enum interval_tree_order { 66enum interval_tree_order {
@@ -79,7 +81,8 @@ void interval_tree_clear (struct interval_tree *);
79void interval_tree_insert (struct interval_tree *, struct interval_node *); 81void interval_tree_insert (struct interval_tree *, struct interval_node *);
80bool interval_tree_contains (struct interval_tree *, struct interval_node *); 82bool interval_tree_contains (struct interval_tree *, struct interval_node *);
81struct interval_node *interval_tree_remove (struct interval_tree *, struct interval_node *); 83struct interval_node *interval_tree_remove (struct interval_tree *, struct interval_node *);
82void interval_tree_iter_start (struct interval_tree *, ptrdiff_t, ptrdiff_t, enum interval_tree_order); 84void interval_tree_iter_start (struct interval_tree *, ptrdiff_t, ptrdiff_t, enum interval_tree_order,
85 const char* file, int line);
83void interval_tree_iter_narrow (struct interval_tree *, ptrdiff_t, ptrdiff_t); 86void interval_tree_iter_narrow (struct interval_tree *, ptrdiff_t, ptrdiff_t);
84void interval_tree_iter_finish (struct interval_tree *); 87void interval_tree_iter_finish (struct interval_tree *);
85struct interval_node *interval_tree_iter_next (struct interval_tree *); 88struct interval_node *interval_tree_iter_next (struct interval_tree *);