aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorStefan Monnier2022-11-01 21:38:55 -0400
committerStefan Monnier2022-11-01 21:39:12 -0400
commit8a5678906fa1b899c4d111e5ee4334b278f50d48 (patch)
tree37a1266d9a21cdccb9dcf220e680c23f2576c7f2 /src
parent835295381bdee3d517c7ee243a22640c78783a9f (diff)
downloademacs-8a5678906fa1b899c4d111e5ee4334b278f50d48.tar.gz
emacs-8a5678906fa1b899c4d111e5ee4334b278f50d48.zip
src/buffer.c: Fix interaction between overlays & indirect buffers (bug#58928)
* src/buffer.c (adjust_overlays_for_insert) (adjust_overlays_for_delete): Repeat for all buffers sharing the same text. * src/itree.c (itree_insert_gap, itree_delete_gap): Allow an empty tree. * test/src/buffer-tests.el (buffer-tests--overlays-indirect-bug58928): New test.
Diffstat (limited to 'src')
-rw-r--r--src/buffer.c34
-rw-r--r--src/itree.c4
2 files changed, 28 insertions, 10 deletions
diff --git a/src/buffer.c b/src/buffer.c
index b67b989326e..3129aa2890e 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3456,19 +3456,37 @@ overlay_strings (ptrdiff_t pos, struct window *w, unsigned char **pstr)
3456void 3456void
3457adjust_overlays_for_insert (ptrdiff_t pos, ptrdiff_t length) 3457adjust_overlays_for_insert (ptrdiff_t pos, ptrdiff_t length)
3458{ 3458{
3459 /* After an insertion, the lists are still sorted properly, 3459 if (!current_buffer->indirections)
3460 but we may need to update the value of the overlay center. */ 3460 itree_insert_gap (current_buffer->overlays, pos, length);
3461 if (! current_buffer->overlays) 3461 else
3462 return; 3462 {
3463 itree_insert_gap (current_buffer->overlays, pos, length); 3463 struct buffer *base = current_buffer->base_buffer
3464 ? current_buffer->base_buffer
3465 : current_buffer;
3466 Lisp_Object tail, other;
3467 itree_insert_gap (base->overlays, pos, length);
3468 FOR_EACH_LIVE_BUFFER (tail, other)
3469 if (XBUFFER (other)->base_buffer == base)
3470 itree_insert_gap (XBUFFER (other)->overlays, pos, length);
3471 }
3464} 3472}
3465 3473
3466void 3474void
3467adjust_overlays_for_delete (ptrdiff_t pos, ptrdiff_t length) 3475adjust_overlays_for_delete (ptrdiff_t pos, ptrdiff_t length)
3468{ 3476{
3469 if (! current_buffer->overlays) 3477 if (!current_buffer->indirections)
3470 return; 3478 itree_delete_gap (current_buffer->overlays, pos, length);
3471 itree_delete_gap (current_buffer->overlays, pos, length); 3479 else
3480 {
3481 struct buffer *base = current_buffer->base_buffer
3482 ? current_buffer->base_buffer
3483 : current_buffer;
3484 Lisp_Object tail, other;
3485 itree_delete_gap (base->overlays, pos, length);
3486 FOR_EACH_LIVE_BUFFER (tail, other)
3487 if (XBUFFER (other)->base_buffer == base)
3488 itree_delete_gap (XBUFFER (other)->overlays, pos, length);
3489 }
3472} 3490}
3473 3491
3474 3492
diff --git a/src/itree.c b/src/itree.c
index 3b10802ff09..bd4e8cc5740 100644
--- a/src/itree.c
+++ b/src/itree.c
@@ -1196,7 +1196,7 @@ void
1196itree_insert_gap (struct itree_tree *tree, 1196itree_insert_gap (struct itree_tree *tree,
1197 ptrdiff_t pos, ptrdiff_t length) 1197 ptrdiff_t pos, ptrdiff_t length)
1198{ 1198{
1199 if (length <= 0 || tree->root == NULL) 1199 if (!tree || length <= 0 || tree->root == NULL)
1200 return; 1200 return;
1201 uintmax_t ootick = tree->otick; 1201 uintmax_t ootick = tree->otick;
1202 1202
@@ -1280,7 +1280,7 @@ void
1280itree_delete_gap (struct itree_tree *tree, 1280itree_delete_gap (struct itree_tree *tree,
1281 ptrdiff_t pos, ptrdiff_t length) 1281 ptrdiff_t pos, ptrdiff_t length)
1282{ 1282{
1283 if (length <= 0 || tree->root == NULL) 1283 if (!tree || length <= 0 || tree->root == NULL)
1284 return; 1284 return;
1285 1285
1286 /* FIXME: Don't allocate stack anew every time. */ 1286 /* FIXME: Don't allocate stack anew every time. */