diff options
| author | Gerd Möllmann | 2022-09-28 16:30:34 +0200 |
|---|---|---|
| committer | Gerd Möllmann | 2022-09-28 16:30:34 +0200 |
| commit | 498d331b07117408c5c5d8a3889b49b275b9a654 (patch) | |
| tree | 645d97f0bd0b9e310b6257b515d14026071d04bd /src | |
| parent | 8173a292e7366beff0279480cbd2f73bf2357568 (diff) | |
| download | emacs-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.h | 9 | ||||
| -rw-r--r-- | src/itree.c | 11 | ||||
| -rw-r--r-- | src/itree.h | 5 |
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 | ||
| 1459 | INLINE void | 1459 | INLINE void |
| 1460 | buffer_overlay_iter_start (struct buffer *b, ptrdiff_t begin, ptrdiff_t end, | 1460 | buffer_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 | |||
| 1467 | INLINE struct interval_node* | 1470 | INLINE struct interval_node* |
| 1468 | buffer_overlay_iter_next (struct buffer *b) | 1471 | buffer_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, | |||
| 434 | void | 434 | void |
| 435 | interval_tree_iter_start (struct interval_tree *tree, | 435 | interval_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 | ||
| 64 | enum interval_tree_order { | 66 | enum interval_tree_order { |
| @@ -79,7 +81,8 @@ void interval_tree_clear (struct interval_tree *); | |||
| 79 | void interval_tree_insert (struct interval_tree *, struct interval_node *); | 81 | void interval_tree_insert (struct interval_tree *, struct interval_node *); |
| 80 | bool interval_tree_contains (struct interval_tree *, struct interval_node *); | 82 | bool interval_tree_contains (struct interval_tree *, struct interval_node *); |
| 81 | struct interval_node *interval_tree_remove (struct interval_tree *, struct interval_node *); | 83 | struct interval_node *interval_tree_remove (struct interval_tree *, struct interval_node *); |
| 82 | void interval_tree_iter_start (struct interval_tree *, ptrdiff_t, ptrdiff_t, enum interval_tree_order); | 84 | void interval_tree_iter_start (struct interval_tree *, ptrdiff_t, ptrdiff_t, enum interval_tree_order, |
| 85 | const char* file, int line); | ||
| 83 | void interval_tree_iter_narrow (struct interval_tree *, ptrdiff_t, ptrdiff_t); | 86 | void interval_tree_iter_narrow (struct interval_tree *, ptrdiff_t, ptrdiff_t); |
| 84 | void interval_tree_iter_finish (struct interval_tree *); | 87 | void interval_tree_iter_finish (struct interval_tree *); |
| 85 | struct interval_node *interval_tree_iter_next (struct interval_tree *); | 88 | struct interval_node *interval_tree_iter_next (struct interval_tree *); |