From d8b2a96214c9b53ab914901fdde71f5b0a931678 Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Mon, 6 Dec 2010 01:54:52 -0500 Subject: [PATCH] Fix crash with invisible text and overlays (Bug#7016). * 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 | 4 ++-- src/ChangeLog | 9 +++++++++ src/dispextern.h | 6 ++++++ src/xdisp.c | 10 +++++++--- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el index ff04b76bf82..3f5660e82cb 100644 --- a/lisp/mail/rmail.el +++ b/lisp/mail/rmail.el @@ -4290,7 +4290,7 @@ With prefix argument N moves forward N messages with these labels. ;;;*** -;;;### (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. ;;;### (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" "\ diff --git a/src/ChangeLog b/src/ChangeLog index d10b5d194a9..3293ec08da5 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,12 @@ +2010-12-06 Chong Yidong + + * 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 * nsterm.m (ns_dumpglyphs_image): If drawing cursor, fill background diff --git a/src/dispextern.h b/src/dispextern.h index bc34aec2dd5..b43565739ea 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -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 diff --git a/src/xdisp.c b/src/xdisp.c index dbe3e443c67..161e2b1cc4d 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -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 -- 2.39.2