diff options
| author | Stefan Monnier | 2022-11-01 21:38:55 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2022-11-01 21:39:12 -0400 |
| commit | 8a5678906fa1b899c4d111e5ee4334b278f50d48 (patch) | |
| tree | 37a1266d9a21cdccb9dcf220e680c23f2576c7f2 /src | |
| parent | 835295381bdee3d517c7ee243a22640c78783a9f (diff) | |
| download | emacs-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.c | 34 | ||||
| -rw-r--r-- | src/itree.c | 4 |
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) | |||
| 3456 | void | 3456 | void |
| 3457 | adjust_overlays_for_insert (ptrdiff_t pos, ptrdiff_t length) | 3457 | adjust_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 | ||
| 3466 | void | 3474 | void |
| 3467 | adjust_overlays_for_delete (ptrdiff_t pos, ptrdiff_t length) | 3475 | adjust_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 | |||
| 1196 | itree_insert_gap (struct itree_tree *tree, | 1196 | itree_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 | |||
| 1280 | itree_delete_gap (struct itree_tree *tree, | 1280 | itree_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. */ |