Fix bug #15841 with assertion violations due to newline cache.
src/insdel.c (invalidate_buffer_caches): New function, consolidated from part of prepare_to_modify_buffer. (insert_from_gap, prepare_to_modify_buffer): src/coding.c (code_convert_region, code_convert_string): Call invalidate_buffer_caches. src/lisp.h (invalidate_buffer_caches): Add prototype.
This commit is contained in:
parent
f2cbfd4442
commit
37c790b385
4 changed files with 52 additions and 12 deletions
|
@ -1,3 +1,13 @@
|
|||
2013-11-18 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* insdel.c (invalidate_buffer_caches): New function, consolidated
|
||||
from part of prepare_to_modify_buffer.
|
||||
(insert_from_gap, prepare_to_modify_buffer):
|
||||
* coding.c (code_convert_region, code_convert_string): Call
|
||||
invalidate_buffer_caches. (Bug#15841)
|
||||
|
||||
* lisp.h (invalidate_buffer_caches): Add prototype.
|
||||
|
||||
2013-11-17 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* w32term.c (x_update_window_end): Don't invalidate the entire
|
||||
|
|
17
src/coding.c
17
src/coding.c
|
@ -9358,6 +9358,14 @@ code_convert_region (Lisp_Object start, Lisp_Object end,
|
|||
setup_coding_system (coding_system, &coding);
|
||||
coding.mode |= CODING_MODE_LAST_BLOCK;
|
||||
|
||||
if (BUFFERP (dst_object) && !EQ (dst_object, src_object))
|
||||
{
|
||||
struct buffer *buf = XBUFFER (dst_object);
|
||||
ptrdiff_t buf_pt = BUF_PT (buf);
|
||||
|
||||
invalidate_buffer_caches (buf, buf_pt, buf_pt);
|
||||
}
|
||||
|
||||
if (encodep)
|
||||
encode_coding_object (&coding, src_object, from, from_byte, to, to_byte,
|
||||
dst_object);
|
||||
|
@ -9447,6 +9455,15 @@ code_convert_string (Lisp_Object string, Lisp_Object coding_system,
|
|||
coding.mode |= CODING_MODE_LAST_BLOCK;
|
||||
chars = SCHARS (string);
|
||||
bytes = SBYTES (string);
|
||||
|
||||
if (BUFFERP (dst_object))
|
||||
{
|
||||
struct buffer *buf = XBUFFER (dst_object);
|
||||
ptrdiff_t buf_pt = BUF_PT (buf);
|
||||
|
||||
invalidate_buffer_caches (buf, buf_pt, buf_pt);
|
||||
}
|
||||
|
||||
if (encodep)
|
||||
encode_coding_object (&coding, string, 0, 0, chars, bytes, dst_object);
|
||||
else
|
||||
|
|
36
src/insdel.c
36
src/insdel.c
|
@ -993,6 +993,11 @@ insert_from_gap (ptrdiff_t nchars, ptrdiff_t nbytes, bool text_at_gap_tail)
|
|||
if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
|
||||
nchars = nbytes;
|
||||
|
||||
/* No need to call prepare_to_modify_buffer, since this is called
|
||||
from places that replace some region with a different text, so
|
||||
prepare_to_modify_buffer was already called by the deletion part
|
||||
of this dance. */
|
||||
invalidate_buffer_caches (current_buffer, GPT, GPT);
|
||||
record_insert (GPT, nchars);
|
||||
MODIFF++;
|
||||
|
||||
|
@ -1869,19 +1874,26 @@ prepare_to_modify_buffer (ptrdiff_t start, ptrdiff_t end,
|
|||
ptrdiff_t *preserve_ptr)
|
||||
{
|
||||
prepare_to_modify_buffer_1 (start, end, preserve_ptr);
|
||||
invalidate_buffer_caches (current_buffer, start, end);
|
||||
}
|
||||
|
||||
if (current_buffer->newline_cache)
|
||||
invalidate_region_cache (current_buffer,
|
||||
current_buffer->newline_cache,
|
||||
start - BEG, Z - end);
|
||||
if (current_buffer->width_run_cache)
|
||||
invalidate_region_cache (current_buffer,
|
||||
current_buffer->width_run_cache,
|
||||
start - BEG, Z - end);
|
||||
if (current_buffer->bidi_paragraph_cache)
|
||||
invalidate_region_cache (current_buffer,
|
||||
current_buffer->bidi_paragraph_cache,
|
||||
start - BEG, Z - end);
|
||||
/* Invalidate the caches maintained by the buffer BUF, if any, for the
|
||||
region between buffer positions START and END. */
|
||||
void
|
||||
invalidate_buffer_caches (struct buffer *buf, ptrdiff_t start, ptrdiff_t 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);
|
||||
if (buf->bidi_paragraph_cache)
|
||||
invalidate_region_cache (buf,
|
||||
buf->bidi_paragraph_cache,
|
||||
start - BUF_BEG (buf), BUF_Z (buf) - end);
|
||||
}
|
||||
|
||||
/* These macros work with an argument named `preserve_ptr'
|
||||
|
|
|
@ -3479,6 +3479,7 @@ extern Lisp_Object del_range_2 (ptrdiff_t, ptrdiff_t,
|
|||
extern void modify_text (ptrdiff_t, ptrdiff_t);
|
||||
extern void prepare_to_modify_buffer (ptrdiff_t, ptrdiff_t, ptrdiff_t *);
|
||||
extern void prepare_to_modify_buffer_1 (ptrdiff_t, ptrdiff_t, ptrdiff_t *);
|
||||
extern void invalidate_buffer_caches (struct buffer *, ptrdiff_t, ptrdiff_t);
|
||||
extern void signal_after_change (ptrdiff_t, ptrdiff_t, ptrdiff_t);
|
||||
extern void adjust_after_insert (ptrdiff_t, ptrdiff_t, ptrdiff_t,
|
||||
ptrdiff_t, ptrdiff_t);
|
||||
|
|
Loading…
Add table
Reference in a new issue