--- Begin Message ---
Subject: |
move-overlay creates an empty overlay with the evaporate property |
Date: |
Fri, 30 Sep 2011 15:55:02 -0700 |
User-agent: |
Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.22) Gecko/20110906 Fedora/3.1.14-1.fc14 Thunderbird/3.1.14 |
Package: Emacs
Version: 24.0.90
Tags: patch
In a nonempty buffer, the following:
(let ((o (make-overlay 1 2)))
(overlay-put o 'evaporate t)
(move-overlay o 0 1))
returns an empty overlay that has the evaporate property.
But this is not supposed to happen: when an overlay with that
property becomes empty, it's supposed to be deleted.
Here's a patch that I'd like to install after a bit more testing.
* 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.
=== modified file 'src/buffer.c'
--- src/buffer.c 2011-09-30 20:22:01 +0000
+++ src/buffer.c 2011-09-30 22:29:34 +0000
@@ -3673,6 +3673,7 @@
struct buffer *b, *ob;
Lisp_Object obuffer;
int count = SPECPDL_INDEX ();
+ ptrdiff_t n_beg, n_end;
CHECK_OVERLAY (overlay);
if (NILP (buffer))
@@ -3691,15 +3692,20 @@
CHECK_NUMBER_COERCE_MARKER (beg);
CHECK_NUMBER_COERCE_MARKER (end);
- if (XINT (beg) == XINT (end) && ! NILP (Foverlay_get (overlay, Qevaporate)))
+ if (XINT (beg) > XINT (end))
+ {
+ Lisp_Object temp;
+ temp = beg; beg = end; end = temp;
+ }
+
+ 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));
+
+ if (n_beg == n_end && ! NILP (Foverlay_get (overlay, Qevaporate)))
return Fdelete_overlay (overlay);
- if (XINT (beg) > XINT (end))
- {
- Lisp_Object temp;
- temp = beg; beg = end; end = temp;
- }
-
specbind (Qinhibit_quit, Qt);
obuffer = Fmarker_buffer (OVERLAY_START (overlay));
@@ -3722,7 +3728,7 @@
}
/* 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. */
@@ -3732,16 +3738,12 @@
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))
@@ -3753,12 +3755,8 @@
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);
--- End Message ---
--- Begin Message ---
Subject: |
Re: bug#9642: closed (Re: bug#9642: move-overlay creates an empty overlay with the evaporate property) |
Date: |
Tue, 29 May 2012 09:16:06 -0700 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20120430 Thunderbird/12.0.1 |
Thanks, I made some minor changes to that fix and
installed it into the trunk in your name, as bzr 108423.
The minor changes were to shrink the patch by restoring
the original indenting and then-else choices, and to
add a couple of IF_LINTs to pacify gcc -Wall.
--- End Message ---