summaryrefslogtreecommitdiff
path: root/src/buffer.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2012-04-28 15:17:27 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2012-04-28 15:17:27 -0700
commit13c379eed08ffee0081d3c86439962a6b2f94500 (patch)
tree26cdb1d8eb9c2093b4968a8571c5d616c910460e /src/buffer.c
parent8b6c19f4c23e69f2133a8432d614abdc03bdadc6 (diff)
downloademacs-13c379eed08ffee0081d3c86439962a6b2f94500.tar.gz
emacs-13c379eed08ffee0081d3c86439962a6b2f94500.tar.bz2
emacs-13c379eed08ffee0081d3c86439962a6b2f94500.zip
Do not avoid creating empty evaporating overlays (Bug#9642).
* buffer.c (Fmove_overlay): Revert the change of 2012-04-23. That is, do not delete an evaporating overlay if it becomes empty after its bounds are adjusted to fit within its buffer. This fix caused other problems, and I'm reverting it until we get to the bottom of them.
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c37
1 files changed, 18 insertions, 19 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 6c2e21c8125..9bac3ec742b 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3682,7 +3682,6 @@ buffer. */)
struct buffer *b, *ob;
Lisp_Object obuffer;
int count = SPECPDL_INDEX ();
- ptrdiff_t n_beg, n_end;
CHECK_OVERLAY (overlay);
if (NILP (buffer))
@@ -3701,23 +3700,15 @@ 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));
@@ -3740,7 +3731,7 @@ buffer. */)
}
/* Redisplay where the overlay is going to be. */
- modify_overlay (b, n_beg, n_end);
+ modify_overlay (b, XINT (beg), XINT (end));
}
else
/* Redisplay the area the overlay has just left, or just enclosed. */
@@ -3750,12 +3741,16 @@ buffer. */)
o_beg = OVERLAY_POSITION (OVERLAY_START (overlay));
o_end = OVERLAY_POSITION (OVERLAY_END (overlay));
- 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);
+ 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));
else
- modify_overlay (b, min (o_beg, n_beg), max (o_end, n_end));
+ {
+ 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);
+ }
}
if (!NILP (obuffer))
@@ -3767,8 +3762,12 @@ 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. */
- if (n_end < b->overlay_center)
+ end = OVERLAY_END (overlay);
+ if (OVERLAY_POSITION (end) < b->overlay_center)
{
XOVERLAY (overlay)->next = b->overlays_after;
b->overlays_after = XOVERLAY (overlay);