Commit 89a438bd authored by Paul Eggert's avatar Paul Eggert
Browse files

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.
parent 7511ded8
2012-04-23 Paul Eggert <eggert@cs.ucla.edu>
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)
......
......@@ -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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment