diff options
Diffstat (limited to 'src/buffer.c')
| -rw-r--r-- | src/buffer.c | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/src/buffer.c b/src/buffer.c index 838932db4df..f73d2d07537 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -667,27 +667,40 @@ CLONE nil means the indirect buffer's state is reset to default values. */) | |||
| 667 | return buf; | 667 | return buf; |
| 668 | } | 668 | } |
| 669 | 669 | ||
| 670 | /* Mark OV as no longer associated with B. */ | ||
| 671 | |||
| 672 | static void | ||
| 673 | drop_overlay (struct buffer *b, struct Lisp_Overlay *ov) | ||
| 674 | { | ||
| 675 | eassert (b == XBUFFER (Fmarker_buffer (ov->start))); | ||
| 676 | modify_overlay (b, marker_position (ov->start), marker_position (ov->end)); | ||
| 677 | Fset_marker (ov->start, Qnil, Qnil); | ||
| 678 | Fset_marker (ov->end, Qnil, Qnil); | ||
| 679 | |||
| 680 | } | ||
| 681 | |||
| 682 | /* Delete all overlays of B and reset it's overlay lists. */ | ||
| 683 | |||
| 670 | void | 684 | void |
| 671 | delete_all_overlays (struct buffer *b) | 685 | delete_all_overlays (struct buffer *b) |
| 672 | { | 686 | { |
| 673 | Lisp_Object overlay; | 687 | struct Lisp_Overlay *ov, *next; |
| 674 | 688 | ||
| 675 | /* `reset_buffer' blindly sets the list of overlays to NULL, so we | 689 | for (ov = b->overlays_before; ov; ov = next) |
| 676 | have to empty the list, otherwise we end up with overlays that | ||
| 677 | think they belong to this buffer while the buffer doesn't know about | ||
| 678 | them any more. */ | ||
| 679 | while (b->overlays_before) | ||
| 680 | { | 690 | { |
| 681 | XSETMISC (overlay, b->overlays_before); | 691 | drop_overlay (b, ov); |
| 682 | Fdelete_overlay (overlay); | 692 | next = ov->next; |
| 693 | ov->next = NULL; | ||
| 683 | } | 694 | } |
| 684 | while (b->overlays_after) | 695 | |
| 696 | for (ov = b->overlays_after; ov; ov = next) | ||
| 685 | { | 697 | { |
| 686 | XSETMISC (overlay, b->overlays_after); | 698 | drop_overlay (b, ov); |
| 687 | Fdelete_overlay (overlay); | 699 | next = ov->next; |
| 700 | ov->next = NULL; | ||
| 688 | } | 701 | } |
| 689 | eassert (b->overlays_before == NULL); | 702 | |
| 690 | eassert (b->overlays_after == NULL); | 703 | b->overlays_before = b->overlays_after = NULL; |
| 691 | } | 704 | } |
| 692 | 705 | ||
| 693 | /* Reinitialize everything about a buffer except its name and contents | 706 | /* Reinitialize everything about a buffer except its name and contents |
| @@ -3820,11 +3833,7 @@ DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0, | |||
| 3820 | = unchain_overlay (b->overlays_after, XOVERLAY (overlay)); | 3833 | = unchain_overlay (b->overlays_after, XOVERLAY (overlay)); |
| 3821 | eassert (XOVERLAY (overlay)->next == NULL); | 3834 | eassert (XOVERLAY (overlay)->next == NULL); |
| 3822 | 3835 | ||
| 3823 | modify_overlay (b, | 3836 | drop_overlay (b, XOVERLAY (overlay)); |
| 3824 | marker_position (OVERLAY_START (overlay)), | ||
| 3825 | marker_position (OVERLAY_END (overlay))); | ||
| 3826 | Fset_marker (OVERLAY_START (overlay), Qnil, Qnil); | ||
| 3827 | Fset_marker (OVERLAY_END (overlay), Qnil, Qnil); | ||
| 3828 | 3837 | ||
| 3829 | /* When deleting an overlay with before or after strings, turn off | 3838 | /* When deleting an overlay with before or after strings, turn off |
| 3830 | display optimizations for the affected buffer, on the basis that | 3839 | display optimizations for the affected buffer, on the basis that |