diff options
-rw-r--r-- | src/alloc.c | 20 | ||||
-rw-r--r-- | src/itree.h | 3 |
2 files changed, 5 insertions, 18 deletions
diff --git a/src/alloc.c b/src/alloc.c index db8f39a60e0..50968b7e121 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -6512,21 +6512,6 @@ mark_overlay (struct Lisp_Overlay *ov) mark_object (ov->plist); } -static void -mark_overlays (struct interval_tree *it, struct interval_node *in) -{ - /* `left/right` are set to NULL when the overlay is deleted, but - they use the `null` node instead when the overlay is not deleted - (i.e. is within an overlay tree). */ - eassert (in); - if (in == ITREE_NULL) - return; - - mark_object (in->data); - mark_overlays (it, in->left); - mark_overlays (it, in->right); -} - /* Mark Lisp_Objects and special pointers in BUFFER. */ static void @@ -6548,8 +6533,9 @@ mark_buffer (struct buffer *buffer) if (!BUFFER_LIVE_P (buffer)) mark_object (BVAR (buffer, undo_list)); - if (buffer->overlays) - mark_overlays (buffer->overlays, buffer->overlays->root); + struct interval_node *node; + ITREE_FOREACH (node, buffer->overlays, PTRDIFF_MIN, PTRDIFF_MAX, ASCENDING) + mark_object (node->data); /* If this is an indirect buffer, mark its base buffer. */ if (buffer->base_buffer && diff --git a/src/itree.h b/src/itree.h index 1f019a2607e..29bc8dd1b25 100644 --- a/src/itree.h +++ b/src/itree.h @@ -105,7 +105,8 @@ void interval_tree_delete_gap (struct interval_tree *, ptrdiff_t, ptrdiff_t); - The expression T may be evaluated more than once, so make sure it is cheap a pure. - Only a single iteration can happen at a time, so make sure none of the - code within the loop can start another tree_itertion. + code within the loop can start another tree iteration, i.e. it shouldn't + be able to run ELisp code (or GC for that matter). - If you need to exit the loop early, you *have* to call `ITREE_ABORT` just before exiting (e.g. with `break` or `return`). - Non-local exits are not supported within the body of the loop, |