]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix crash with invisible text and overlays (Bug#7016).
authorChong Yidong <cyd@stupidchicken.com>
Mon, 6 Dec 2010 06:54:52 +0000 (01:54 -0500)
committerChong Yidong <cyd@stupidchicken.com>
Mon, 6 Dec 2010 06:54:52 +0000 (01:54 -0500)
* src/dispextern.h (struct it): New member overlay_strings_charpos.

* src/xdisp.c (next_overlay_string, load_overlay_strings): Record the
charpos where we computed n_overlay_strings.
(next_overlay_string): Load overlay strings at recorded position,
which may not be the same as the iterator's charpos (Bug#7016).

lisp/mail/rmail.el
src/ChangeLog
src/dispextern.h
src/xdisp.c

index ff04b76bf82978863e5bcd39a6c24715d79ea75d..3f5660e82cb3f84d08103954653299f56603c5cc 100644 (file)
@@ -4290,7 +4290,7 @@ With prefix argument N moves forward N messages with these labels.
 
 ;;;***
 \f
-;;;### (autoloads (rmail-mime) "rmailmm" "rmailmm.el" "4a7502b4aeb3bd5f2111b48cc6512924")
+;;;### (autoloads (rmail-mime) "rmailmm" "rmailmm.el" "222ca7c1e672a08e5799e5a72fb25049")
 ;;; Generated autoloads from rmailmm.el
 
 (autoload 'rmail-mime "rmailmm" "\
@@ -4381,7 +4381,7 @@ If prefix argument REVERSE is non-nil, sorts in reverse order.
 \f
 ;;;### (autoloads (rmail-summary-by-senders rmail-summary-by-topic
 ;;;;;;  rmail-summary-by-regexp rmail-summary-by-recipients rmail-summary-by-labels
-;;;;;;  rmail-summary) "rmailsum" "rmailsum.el" "26b95919c7e1f8c5609ce7323aee77ae")
+;;;;;;  rmail-summary) "rmailsum" "rmailsum.el" "d855683972baef7111d4508dffbb54b6")
 ;;; Generated autoloads from rmailsum.el
 
 (autoload 'rmail-summary "rmailsum" "\
index d10b5d194a91e9b4783f36183c34618bbd33ffc0..3293ec08da51d5d549c3fa2f4473325ef53c076e 100644 (file)
@@ -1,3 +1,12 @@
+2010-12-06  Chong Yidong  <cyd@stupidchicken.com>
+
+       * dispextern.h (struct it): New member overlay_strings_charpos.
+
+       * xdisp.c (next_overlay_string, load_overlay_strings): Record the
+       charpos where we computed n_overlay_strings.
+       (next_overlay_string): Load overlay strings at recorded position,
+       which may not be the same as the iterator's charpos (Bug#7016).
+
 2010-12-05  Jan Djärv  <jan.h.d@swipnet.se>
 
        * nsterm.m (ns_dumpglyphs_image): If drawing cursor, fill background
index bc34aec2dd5ef69c93d15186d53f23bc437a7450..b43565739ea4cef146360a83e41bee1cb208dc7e 100644 (file)
@@ -1989,6 +1989,12 @@ struct it
      OVERLAY_STRING_CHUNK_SIZE.  */
   int n_overlay_strings;
 
+  /* The charpos where n_overlay_strings was calculated.  This should
+     be set at the same time as n_overlay_strings.  It is needed
+     because we show before-strings at the start of invisible text;
+     see handle_invisible_prop in xdisp.c.  */
+  int overlay_strings_charpos;
+
   /* Vector of overlays to process.  Overlay strings are processed
      OVERLAY_STRING_CHUNK_SIZE at a time.  */
 #define OVERLAY_STRING_CHUNK_SIZE 16
index dbe3e443c67d01518280f52d6117dbfef96c6458..161e2b1cc4d031193060dd6e1e54bca1e8e47dcd 100644 (file)
@@ -4717,6 +4717,7 @@ next_overlay_string (it)
                   && it->stop_charpos <= it->end_charpos));
       it->current.overlay_string_index = -1;
       it->n_overlay_strings = 0;
+      it->overlay_strings_charpos = -1;
 
       /* If we're at the end of the buffer, record that we have
         processed the overlay strings there already, so that
@@ -4729,11 +4730,13 @@ next_overlay_string (it)
       /* There are more overlay strings to process.  If
         IT->current.overlay_string_index has advanced to a position
         where we must load IT->overlay_strings with more strings, do
-        it.  */
+        it.  We must load at the IT->overlay_strings_charpos where
+        IT->n_overlay_strings was originally computed; when invisible
+        text is present, this might not be IT_CHARPOS (Bug#7016).  */
       int i = it->current.overlay_string_index % OVERLAY_STRING_CHUNK_SIZE;
 
       if (it->current.overlay_string_index && i == 0)
-       load_overlay_strings (it, 0);
+       load_overlay_strings (it, it->overlay_strings_charpos);
 
       /* Initialize IT to deliver display elements from the overlay
          string.  */
@@ -4949,8 +4952,9 @@ load_overlay_strings (it, charpos)
   if (n > 1)
     qsort (entries, n, sizeof *entries, compare_overlay_entries);
 
-  /* Record the total number of strings to process.  */
+  /* Record number of overlay strings, and where we computed it.  */
   it->n_overlay_strings = n;
+  it->overlay_strings_charpos = charpos;
 
   /* IT->current.overlay_string_index is the number of overlay strings
      that have already been consumed by IT.  Copy some of the