emacs-bug-tracker
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debbugs-tracker] bug#9642: closed (move-overlay creates an empty overla


From: GNU bug Tracking System
Subject: [debbugs-tracker] bug#9642: closed (move-overlay creates an empty overlay with the evaporate property)
Date: Tue, 29 May 2012 16:18:01 +0000

Your message dated Tue, 29 May 2012 09:16:06 -0700
with message-id <address@hidden>
and subject line Re: bug#9642: closed (Re: bug#9642: move-overlay creates an 
empty overlay with the evaporate property)
has caused the debbugs.gnu.org bug report #9642,
regarding move-overlay creates an empty overlay with the evaporate property
to be marked as done.

(If you believe you have received this mail in error, please contact
address@hidden)


-- 
9642: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=9642
GNU Bug Tracking System
Contact address@hidden with problems
--- 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 ---

reply via email to

[Prev in Thread] Current Thread [Next in Thread]