[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
feature/noverlay b8fbd42f0a 1/2: mark_overlays: Use the normal ITREE_FOR
From: |
Stefan Monnier |
Subject: |
feature/noverlay b8fbd42f0a 1/2: mark_overlays: Use the normal ITREE_FOREACH |
Date: |
Sun, 2 Oct 2022 12:27:45 -0400 (EDT) |
branch: feature/noverlay
commit b8fbd42f0a7caa4cd9e2d50dd4e4b2101ac78acd
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>
mark_overlays: Use the normal ITREE_FOREACH
This commit basically reverts commit 5b954f8f9. The problem of nested
iterations hasn't been fixed in the mean time, but since the GC can
run arbitrary ELisp code (via `post-gc-hook`), running the GC from
within an itree iteration is already unsafe anyway :-(
* src/alloc.c (mark_overlays): Delete function.
(mark_buffer): Use ITREE_FOREACH.
---
src/alloc.c | 20 +++-----------------
src/itree.h | 3 ++-
2 files changed, 5 insertions(+), 18 deletions(-)
diff --git a/src/alloc.c b/src/alloc.c
index db8f39a60e..50968b7e12 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 1f019a2607..29bc8dd1b2 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,