From 89a438bd861e9b80e8f80a23955624c74782921a Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 23 Apr 2012 15:46:35 -0700 Subject: [PATCH] Do not create empty overlays with the evaporate property (Bug#9642). * buffer.c (Fmove_overlay): Delete an evaporating overlay if it becomes empty after its bounds are adjusted to fit within its buffer. Without this fix, in a nonempty buffer (let ((o (make-overlay 1 2))) (overlay-put o 'evaporate t) (move-overlay o 0 1)) yields an empty overlay that has the evaporate property, which is not supposed to happen. --- src/ChangeLog | 8 ++++++++ src/buffer.c | 37 +++++++++++++++++++------------------ 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 1db958d8d67..8cb5202613e 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,13 @@ 2012-04-23 Paul Eggert + Do not create empty overlays with the evaporate property (Bug#9642). + * buffer.c (Fmove_overlay): Delete an evaporating overlay + if it becomes empty after its bounds are adjusted to fit within + its buffer. Without this fix, in a nonempty buffer (let ((o + (make-overlay 1 2))) (overlay-put o 'evaporate t) (move-overlay o 0 1)) + yields an empty overlay that has the evaporate property, which is + not supposed to happen. + Fix minor GTK3 problems found by static checking. * emacsgtkfixed.c (EMACS_TYPE_FIXED, EMACS_FIXED, EmacsFixed) (EmacsFixedPrivate, EmacsFixedClass, struct _EmacsFixed) diff --git a/src/buffer.c b/src/buffer.c index 9bac3ec742b..6c2e21c8125 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -3682,6 +3682,7 @@ buffer. */) struct buffer *b, *ob; Lisp_Object obuffer; int count = SPECPDL_INDEX (); + ptrdiff_t n_beg, n_end; CHECK_OVERLAY (overlay); if (NILP (buffer)) @@ -3700,15 +3701,23 @@ buffer. */) CHECK_NUMBER_COERCE_MARKER (beg); CHECK_NUMBER_COERCE_MARKER (end); - if (XINT (beg) == XINT (end) && ! NILP (Foverlay_get (overlay, Qevaporate))) - return Fdelete_overlay (overlay); - if (XINT (beg) > XINT (end)) { Lisp_Object temp; temp = beg; beg = end; end = temp; } + /* First set the overlay boundaries, which may clip them. */ + Fset_marker (OVERLAY_START (overlay), beg, buffer); + Fset_marker (OVERLAY_END (overlay), end, buffer); + n_beg = marker_position (OVERLAY_START (overlay)); + n_end = marker_position (OVERLAY_END (overlay)); + + /* Now, delete the overlay if it is empty after clipping and has the + evaporate property. */ + if (n_beg == n_end && ! NILP (Foverlay_get (overlay, Qevaporate))) + return Fdelete_overlay (overlay); + specbind (Qinhibit_quit, Qt); obuffer = Fmarker_buffer (OVERLAY_START (overlay)); @@ -3731,7 +3740,7 @@ buffer. */) } /* Redisplay where the overlay is going to be. */ - modify_overlay (b, XINT (beg), XINT (end)); + modify_overlay (b, n_beg, n_end); } else /* Redisplay the area the overlay has just left, or just enclosed. */ @@ -3741,16 +3750,12 @@ buffer. */) o_beg = OVERLAY_POSITION (OVERLAY_START (overlay)); o_end = OVERLAY_POSITION (OVERLAY_END (overlay)); - if (o_beg == XINT (beg)) - modify_overlay (b, o_end, XINT (end)); - else if (o_end == XINT (end)) - modify_overlay (b, o_beg, XINT (beg)); + if (o_beg == n_beg) + modify_overlay (b, o_end, n_end); + else if (o_end == n_end) + modify_overlay (b, o_beg, n_beg); else - { - if (XINT (beg) < o_beg) o_beg = XINT (beg); - if (XINT (end) > o_end) o_end = XINT (end); - modify_overlay (b, o_beg, o_end); - } + modify_overlay (b, min (o_beg, n_beg), max (o_end, n_end)); } if (!NILP (obuffer)) @@ -3762,12 +3767,8 @@ buffer. */) eassert (XOVERLAY (overlay)->next == NULL); } - Fset_marker (OVERLAY_START (overlay), beg, buffer); - Fset_marker (OVERLAY_END (overlay), end, buffer); - /* Put the overlay on the wrong list. */ - end = OVERLAY_END (overlay); - if (OVERLAY_POSITION (end) < b->overlay_center) + if (n_end < b->overlay_center) { XOVERLAY (overlay)->next = b->overlays_after; b->overlays_after = XOVERLAY (overlay); -- 2.39.2