[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#15841: Display bugs with cache-long-lines non-nil
From: |
Eli Zaretskii |
Subject: |
bug#15841: Display bugs with cache-long-lines non-nil |
Date: |
Fri, 15 Nov 2013 18:34:05 +0200 |
> Date: Tue, 12 Nov 2013 18:31:32 +0200
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: 15841@debbugs.gnu.org
>
> In any case, I already traced through the code that is involved, and
> the immediate reason for the assertion violation is that the cache
> isn't being updated wrt changes in buffer size (which are caused by
> decoding the stuff brought in by 'ls'). However, a naive attempt to
> force such updates didn't solve the whole problem: the aborts are
> gone, but the infloop is still there, and also other minor display
> issues. So I guess there's another factor at work there...
I think I might have found a solution for this. Could you please run
with the patch below for a while, and see if it gives good results?
=== modified file 'src/coding.c'
--- src/coding.c 2013-10-08 06:40:09 +0000
+++ src/coding.c 2013-11-15 16:27:56 +0000
@@ -9358,6 +9358,14 @@ code_convert_region (Lisp_Object start,
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,
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
=== modified file 'src/insdel.c'
--- src/insdel.c 2013-11-11 05:18:53 +0000
+++ src/insdel.c 2013-11-15 16:27:56 +0000
@@ -993,6 +993,11 @@ insert_from_gap (ptrdiff_t nchars, ptrdi
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 star
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'
=== modified file 'src/lisp.h'
--- src/lisp.h 2013-11-15 08:18:37 +0000
+++ src/lisp.h 2013-11-15 16:27:56 +0000
@@ -3486,6 +3486,7 @@ extern Lisp_Object del_range_2 (ptrdiff_
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);
- bug#15841: Display bugs with cache-long-lines non-nil, (continued)
- bug#15841: Display bugs with cache-long-lines non-nil, Eli Zaretskii, 2013/11/09
- bug#15841: Display bugs with cache-long-lines non-nil, Stephen Berman, 2013/11/11
- bug#15841: Display bugs with cache-long-lines non-nil, Eli Zaretskii, 2013/11/11
- bug#15841: Display bugs with cache-long-lines non-nil, Stephen Berman, 2013/11/11
- bug#15841: Display bugs with cache-long-lines non-nil, Stephen Berman, 2013/11/11
- bug#15841: Display bugs with cache-long-lines non-nil, Stephen Berman, 2013/11/12
- bug#15841: Display bugs with cache-long-lines non-nil, Eli Zaretskii, 2013/11/12
- bug#15841: Display bugs with cache-long-lines non-nil, Stephen Berman, 2013/11/12
- bug#15841: Display bugs with cache-long-lines non-nil,
Eli Zaretskii <=
- bug#15841: Display bugs with cache-long-lines non-nil, Stephen Berman, 2013/11/15
- bug#15841: Display bugs with cache-long-lines non-nil, Andy Moreton, 2013/11/16
- bug#15841: Display bugs with cache-long-lines non-nil, Eli Zaretskii, 2013/11/16
- bug#15841: Display bugs with cache-long-lines non-nil, Eli Zaretskii, 2013/11/18
- bug#15797: 24.3.50; Info: Mention cache-long-scans, Michael Heerdegen, 2013/11/06
- bug#15797: 24.3.50; Info: Mention cache-long-scans, Eli Zaretskii, 2013/11/06
- bug#15797: 24.3.50; Info: Mention cache-long-scans, Michael Heerdegen, 2013/11/06
- bug#15797: 24.3.50; Info: Mention cache-long-scans, Eli Zaretskii, 2013/11/06
- bug#15797: 24.3.50; Info: Mention cache-long-scans, Drew Adams, 2013/11/06
- bug#15797: 24.3.50; Info: Mention cache-long-scans, Eli Zaretskii, 2013/11/06