aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
authorTroels Nielsen2012-05-29 09:13:38 -0700
committerPaul Eggert2012-05-29 09:13:38 -0700
commit471fe23dc58361ecad3679a3a57a9f7d949e34d2 (patch)
tree52d4e9f54a5a2b436ae9c0f9a09dfff580f6e90d /src/buffer.c
parent6876a58db34b81e411293b5ee8d161aa451fd767 (diff)
downloademacs-471fe23dc58361ecad3679a3a57a9f7d949e34d2.tar.gz
emacs-471fe23dc58361ecad3679a3a57a9f7d949e34d2.zip
Do not avoid creating empty evaporating overlays (Bug#9642).
* buffer.c (Fmove_overlay): Reinstate the earlier fix for Bug#9642, but explicitly check that the buffer the overlay would be moved to is live and rearrange lines to make sure that errors will not put the overlay in an inconsistent state. (Fdelete_overlay): Cosmetics.
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c85
1 files changed, 43 insertions, 42 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 5d431f21a70..20260d5a5d8 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3676,10 +3676,10 @@ If BUFFER is omitted, and OVERLAY is in no buffer, put it in the current
3676buffer. */) 3676buffer. */)
3677 (Lisp_Object overlay, Lisp_Object beg, Lisp_Object end, Lisp_Object buffer) 3677 (Lisp_Object overlay, Lisp_Object beg, Lisp_Object end, Lisp_Object buffer)
3678{ 3678{
3679 struct buffer *b, *ob; 3679 struct buffer *b, *ob = 0;
3680 Lisp_Object obuffer; 3680 Lisp_Object obuffer;
3681 ptrdiff_t count = SPECPDL_INDEX (); 3681 ptrdiff_t count = SPECPDL_INDEX ();
3682 ptrdiff_t n_beg, n_end; 3682 ptrdiff_t n_beg, n_end, o_beg IF_LINT (= 0), o_end IF_LINT (= 0);
3683 3683
3684 CHECK_OVERLAY (overlay); 3684 CHECK_OVERLAY (overlay);
3685 if (NILP (buffer)) 3685 if (NILP (buffer))
@@ -3688,6 +3688,9 @@ buffer. */)
3688 XSETBUFFER (buffer, current_buffer); 3688 XSETBUFFER (buffer, current_buffer);
3689 CHECK_BUFFER (buffer); 3689 CHECK_BUFFER (buffer);
3690 3690
3691 if (NILP (Fbuffer_live_p (buffer)))
3692 error ("Attempt to move overlay to a dead buffer");
3693
3691 if (MARKERP (beg) 3694 if (MARKERP (beg)
3692 && ! EQ (Fmarker_buffer (beg), buffer)) 3695 && ! EQ (Fmarker_buffer (beg), buffer))
3693 error ("Marker points into wrong buffer"); 3696 error ("Marker points into wrong buffer");
@@ -3697,38 +3700,45 @@ buffer. */)
3697 3700
3698 CHECK_NUMBER_COERCE_MARKER (beg); 3701 CHECK_NUMBER_COERCE_MARKER (beg);
3699 CHECK_NUMBER_COERCE_MARKER (end); 3702 CHECK_NUMBER_COERCE_MARKER (end);
3700 n_beg = clip_to_bounds (PTRDIFF_MIN, XINT (beg), PTRDIFF_MAX);
3701 n_end = clip_to_bounds (PTRDIFF_MIN, XINT (end), PTRDIFF_MAX);
3702
3703 if (n_beg == n_end && ! NILP (Foverlay_get (overlay, Qevaporate)))
3704 return Fdelete_overlay (overlay);
3705 3703
3706 if (n_beg > n_end) 3704 if (XINT (beg) > XINT (end))
3707 { 3705 {
3708 ptrdiff_t temp; 3706 Lisp_Object temp;
3709 temp = n_beg; n_beg = n_end; n_end = temp; 3707 temp = beg; beg = end; end = temp;
3710 } 3708 }
3711 3709
3712 specbind (Qinhibit_quit, Qt); 3710 specbind (Qinhibit_quit, Qt);
3713 3711
3714 obuffer = Fmarker_buffer (OVERLAY_START (overlay)); 3712 obuffer = Fmarker_buffer (OVERLAY_START (overlay));
3715 b = XBUFFER (buffer); 3713 b = XBUFFER (buffer);
3716 ob = BUFFERP (obuffer) ? XBUFFER (obuffer) : (struct buffer *) 0; 3714
3715 if (!NILP (obuffer))
3716 {
3717 ob = XBUFFER (obuffer);
3718
3719 o_beg = OVERLAY_POSITION (OVERLAY_START (overlay));
3720 o_end = OVERLAY_POSITION (OVERLAY_END (overlay));
3721
3722 ob->overlays_before =
3723 unchain_overlay (ob->overlays_before, XOVERLAY (overlay));
3724 ob->overlays_after =
3725 unchain_overlay (ob->overlays_after, XOVERLAY (overlay));
3726 eassert (XOVERLAY (overlay)->next == NULL);
3727 }
3728
3729 /* Set the overlay boundaries, which may clip them. */
3730 Fset_marker (OVERLAY_START (overlay), beg, buffer);
3731 Fset_marker (OVERLAY_END (overlay), end, buffer);
3732
3733 n_beg = marker_position (OVERLAY_START (overlay));
3734 n_end = marker_position (OVERLAY_END (overlay));
3717 3735
3718 /* If the overlay has changed buffers, do a thorough redisplay. */ 3736 /* If the overlay has changed buffers, do a thorough redisplay. */
3719 if (!EQ (buffer, obuffer)) 3737 if (!EQ (buffer, obuffer))
3720 { 3738 {
3721 /* Redisplay where the overlay was. */ 3739 /* Redisplay where the overlay was. */
3722 if (!NILP (obuffer)) 3740 if (ob)
3723 { 3741 modify_overlay (ob, o_beg, o_end);
3724 ptrdiff_t o_beg;
3725 ptrdiff_t o_end;
3726
3727 o_beg = OVERLAY_POSITION (OVERLAY_START (overlay));
3728 o_end = OVERLAY_POSITION (OVERLAY_END (overlay));
3729
3730 modify_overlay (ob, o_beg, o_end);
3731 }
3732 3742
3733 /* Redisplay where the overlay is going to be. */ 3743 /* Redisplay where the overlay is going to be. */
3734 modify_overlay (b, n_beg, n_end); 3744 modify_overlay (b, n_beg, n_end);
@@ -3736,11 +3746,6 @@ buffer. */)
3736 else 3746 else
3737 /* Redisplay the area the overlay has just left, or just enclosed. */ 3747 /* Redisplay the area the overlay has just left, or just enclosed. */
3738 { 3748 {
3739 ptrdiff_t o_beg, o_end;
3740
3741 o_beg = OVERLAY_POSITION (OVERLAY_START (overlay));
3742 o_end = OVERLAY_POSITION (OVERLAY_END (overlay));
3743
3744 if (o_beg == n_beg) 3749 if (o_beg == n_beg)
3745 modify_overlay (b, o_end, n_end); 3750 modify_overlay (b, o_end, n_end);
3746 else if (o_end == n_end) 3751 else if (o_end == n_end)
@@ -3749,21 +3754,14 @@ buffer. */)
3749 modify_overlay (b, min (o_beg, n_beg), max (o_end, n_end)); 3754 modify_overlay (b, min (o_beg, n_beg), max (o_end, n_end));
3750 } 3755 }
3751 3756
3752 if (!NILP (obuffer)) 3757 /* Delete the overlay if it is empty after clipping and has the
3753 { 3758 evaporate property. */
3754 ob->overlays_before 3759 if (n_beg == n_end && !NILP (Foverlay_get (overlay, Qevaporate)))
3755 = unchain_overlay (ob->overlays_before, XOVERLAY (overlay)); 3760 return unbind_to (count, Fdelete_overlay (overlay));
3756 ob->overlays_after
3757 = unchain_overlay (ob->overlays_after, XOVERLAY (overlay));
3758 eassert (XOVERLAY (overlay)->next == NULL);
3759 }
3760
3761 Fset_marker (OVERLAY_START (overlay), beg, buffer);
3762 Fset_marker (OVERLAY_END (overlay), end, buffer);
3763 3761
3764 /* Put the overlay on the wrong list. */ 3762 /* Put the overlay into the new buffer's overlay lists, first on the
3765 end = OVERLAY_END (overlay); 3763 wrong list. */
3766 if (OVERLAY_POSITION (end) < b->overlay_center) 3764 if (n_end < b->overlay_center)
3767 { 3765 {
3768 XOVERLAY (overlay)->next = b->overlays_after; 3766 XOVERLAY (overlay)->next = b->overlays_after;
3769 b->overlays_after = XOVERLAY (overlay); 3767 b->overlays_after = XOVERLAY (overlay);
@@ -3797,9 +3795,12 @@ DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0,
3797 b = XBUFFER (buffer); 3795 b = XBUFFER (buffer);
3798 specbind (Qinhibit_quit, Qt); 3796 specbind (Qinhibit_quit, Qt);
3799 3797
3800 b->overlays_before = unchain_overlay (b->overlays_before,XOVERLAY (overlay)); 3798 b->overlays_before
3801 b->overlays_after = unchain_overlay (b->overlays_after, XOVERLAY (overlay)); 3799 = unchain_overlay (b->overlays_before, XOVERLAY (overlay));
3800 b->overlays_after
3801 = unchain_overlay (b->overlays_after, XOVERLAY (overlay));
3802 eassert (XOVERLAY (overlay)->next == NULL); 3802 eassert (XOVERLAY (overlay)->next == NULL);
3803
3803 modify_overlay (b, 3804 modify_overlay (b,
3804 marker_position (OVERLAY_START (overlay)), 3805 marker_position (OVERLAY_START (overlay)),
3805 marker_position (OVERLAY_END (overlay))); 3806 marker_position (OVERLAY_END (overlay)));