emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/noverlay 498d331b07 1/2: Add debugging help for nested iterators


From: Gerd Moellmann
Subject: feature/noverlay 498d331b07 1/2: Add debugging help for nested iterators (nug#58144)
Date: Wed, 28 Sep 2022 10:39:44 -0400 (EDT)

branch: feature/noverlay
commit 498d331b07117408c5c5d8a3889b49b275b9a654
Author: Gerd Möllmann <gerd@gnu.org>
Commit: Gerd Möllmann <gerd@gnu.org>

    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.
---
 src/buffer.h |  9 ++++++---
 src/itree.c  | 11 +++++++----
 src/itree.h  |  5 ++++-
 3 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/src/buffer.h b/src/buffer.h
index 7d6c693b0f..097283be67 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -1457,13 +1457,16 @@ remove_buffer_overlay (struct buffer *b, struct 
Lisp_Overlay *ov)
 }
 
 INLINE void
-buffer_overlay_iter_start (struct buffer *b, ptrdiff_t begin, ptrdiff_t end,
-                           enum interval_tree_order order)
+buffer_overlay_iter_start1 (struct buffer *b, ptrdiff_t begin, ptrdiff_t end,
+                           enum interval_tree_order order, const char* file, 
int line)
 {
   if (b->overlays)
-    interval_tree_iter_start (b->overlays, begin, end, order);
+    interval_tree_iter_start (b->overlays, begin, end, order, file, line);
 }
 
+#define buffer_overlay_iter_start(b, begin, end, order) \
+  buffer_overlay_iter_start1 ((b), (begin), (end), (order), __FILE__, __LINE__)
+
 INLINE struct interval_node*
 buffer_overlay_iter_next (struct buffer *b)
 {
diff --git a/src/itree.c b/src/itree.c
index a643997062..e31ce39ba1 100644
--- a/src/itree.c
+++ b/src/itree.c
@@ -328,7 +328,7 @@ interval_tree_contains (struct interval_tree *tree, struct 
interval_node *node)
 {
   struct interval_node *other;
 
-  interval_tree_iter_start (tree, node->begin, PTRDIFF_MAX, ITREE_ASCENDING);
+  interval_tree_iter_start (tree, node->begin, PTRDIFF_MAX, ITREE_ASCENDING, 
__FILE__, __LINE__);
   while ((other = interval_tree_iter_next (tree)))
     if (other == node)
       break;
@@ -417,7 +417,7 @@ interval_tree_nodes (struct interval_tree *tree,
 {
   struct interval_node *node;
 
-  interval_tree_iter_start (tree, PTRDIFF_MIN, PTRDIFF_MAX, order);
+  interval_tree_iter_start (tree, PTRDIFF_MIN, PTRDIFF_MAX, order, __FILE__, 
__LINE__);
   while ((node = interval_tree_iter_next (tree)))
     {
       *nodes = node;
@@ -434,12 +434,15 @@ interval_tree_nodes (struct interval_tree *tree,
 void
 interval_tree_iter_start (struct interval_tree *tree,
                           ptrdiff_t begin, ptrdiff_t end,
-                          enum interval_tree_order order)
+                          enum interval_tree_order order,
+                         const char* file, int line)
 {
   if (tree->iter_running)
     emacs_abort ();
   interval_generator_reset (tree->iter, begin, end, order);
   tree->iter_running = 1;
+  tree->file = file;
+  tree->line = line;
 }
 
 /* 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
      order, so we need to remove them first. */
   struct interval_stack *saved = interval_stack_create (0);
   struct interval_node *node = NULL;
-  interval_tree_iter_start (tree, pos, pos + 1, ITREE_PRE_ORDER);
+  interval_tree_iter_start (tree, pos, pos + 1, ITREE_PRE_ORDER, __FILE__, 
__LINE__);
   while ((node = interval_tree_iter_next (tree)))
     {
       if (node->begin == pos && node->front_advance
diff --git a/src/itree.h b/src/itree.h
index 21d8b21a02..e5d68fbfab 100644
--- a/src/itree.h
+++ b/src/itree.h
@@ -59,6 +59,8 @@ struct interval_tree
   intmax_t size;                /* Number of nodes in the tree. */
   struct interval_generator *iter;
   bool_bf iter_running : 1;
+  const char* file;
+  int line;
 };
 
 enum interval_tree_order {
@@ -79,7 +81,8 @@ void interval_tree_clear (struct interval_tree *);
 void interval_tree_insert (struct interval_tree *, struct interval_node *);
 bool interval_tree_contains (struct interval_tree *, struct interval_node *);
 struct interval_node *interval_tree_remove (struct interval_tree *, struct 
interval_node *);
-void interval_tree_iter_start (struct interval_tree *, ptrdiff_t, ptrdiff_t, 
enum interval_tree_order);
+void interval_tree_iter_start (struct interval_tree *, ptrdiff_t, ptrdiff_t, 
enum interval_tree_order,
+                              const char* file, int line);
 void interval_tree_iter_narrow (struct interval_tree *, ptrdiff_t, ptrdiff_t);
 void interval_tree_iter_finish (struct interval_tree *);
 struct interval_node *interval_tree_iter_next (struct interval_tree *);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]