From: Eli Zaretskii Date: Thu, 17 Apr 2014 07:24:40 +0000 (+0300) Subject: Fix bug #17269 with corruption of the newline cache. X-Git-Tag: emacs-24.3.91~134 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=f76da67d4040ec3c766b7f4977341e142348cf60;p=emacs.git Fix bug #17269 with corruption of the newline cache. src/insdel.c (invalidate_buffer_caches): Invalidate the bidi paragraph-start cache before the newline cache. --- diff --git a/src/ChangeLog b/src/ChangeLog index 84760abd019..d0aa2e59e01 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2014-04-17 Eli Zaretskii + + * insdel.c (invalidate_buffer_caches): Invalidate the bidi + paragraph-start cache before the newline cache. (Bug#17269) + 2014-04-16 Stefan Monnier * window.c (save_window_save): Lookup window_point_insertion_type in diff --git a/src/insdel.c b/src/insdel.c index ea5f6301501..85526d46db1 100644 --- a/src/insdel.c +++ b/src/insdel.c @@ -1857,14 +1857,9 @@ invalidate_buffer_caches (struct buffer *buf, ptrdiff_t start, ptrdiff_t end) need to consider the caches of their base buffer. */ if (buf->base_buffer) buf = buf->base_buffer; - if (buf->newline_cache) - invalidate_region_cache (buf, - buf->newline_cache, - start - BUF_BEG (buf), BUF_Z (buf) - end); - if (buf->width_run_cache) - invalidate_region_cache (buf, - buf->width_run_cache, - start - BUF_BEG (buf), BUF_Z (buf) - end); + /* The bidi_paragraph_cache must be invalidated first, because doing + so might need to use the newline_cache (via find_newline_no_quit, + see below). */ if (buf->bidi_paragraph_cache) { if (start != end @@ -1888,13 +1883,20 @@ invalidate_buffer_caches (struct buffer *buf, ptrdiff_t start, ptrdiff_t end) &start_byte); set_buffer_internal (old); } - if (line_beg > BUF_BEG (buf)) - start = line_beg - 1; + start = line_beg - (line_beg > BUF_BEG (buf)); } invalidate_region_cache (buf, buf->bidi_paragraph_cache, start - BUF_BEG (buf), BUF_Z (buf) - end); } + if (buf->newline_cache) + invalidate_region_cache (buf, + buf->newline_cache, + start - BUF_BEG (buf), BUF_Z (buf) - end); + if (buf->width_run_cache) + invalidate_region_cache (buf, + buf->width_run_cache, + start - BUF_BEG (buf), BUF_Z (buf) - end); } /* These macros work with an argument named `preserve_ptr'