aboutsummaryrefslogtreecommitdiffstats
path: root/src/coding.c
diff options
context:
space:
mode:
authorEli Zaretskii2016-07-30 11:23:10 +0300
committerEli Zaretskii2016-07-30 11:23:10 +0300
commit9c542a23a83d1fc883bd942d805259d061e0d189 (patch)
tree53e3571278f70b29105d314b02f2d6c1832e8c6a /src/coding.c
parent4a5b6e621c68172bb69d60fe8a76932f7c779f81 (diff)
downloademacs-9c542a23a83d1fc883bd942d805259d061e0d189.tar.gz
emacs-9c542a23a83d1fc883bd942d805259d061e0d189.zip
Avoid warnings about undo list while decoding
* src/coding.c (coding_restore_undo_list): New function. (decode_coding_gap, decode_coding_object): Temporarily set the buffer's undo list to t, to avoid warnings when decoding changes the buffer many times, e.g. due to post-read-conversion. Use coding_restore_undo_list to make sure the undo list is restored. (Bug#23813)
Diffstat (limited to 'src/coding.c')
-rw-r--r--src/coding.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/coding.c b/src/coding.c
index a8ddc817565..b82d4f5cda9 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -7851,6 +7851,15 @@ code_conversion_save (bool with_work_buf, bool multibyte)
7851 return workbuf; 7851 return workbuf;
7852} 7852}
7853 7853
7854static void
7855coding_restore_undo_list (Lisp_Object arg)
7856{
7857 Lisp_Object undo_list = XCAR (arg);
7858 struct buffer *buf = XBUFFER (XCDR (arg));
7859
7860 bset_undo_list (buf, undo_list);
7861}
7862
7854void 7863void
7855decode_coding_gap (struct coding_system *coding, 7864decode_coding_gap (struct coding_system *coding,
7856 ptrdiff_t chars, ptrdiff_t bytes) 7865 ptrdiff_t chars, ptrdiff_t bytes)
@@ -7963,13 +7972,19 @@ decode_coding_gap (struct coding_system *coding,
7963 { 7972 {
7964 ptrdiff_t prev_Z = Z, prev_Z_BYTE = Z_BYTE; 7973 ptrdiff_t prev_Z = Z, prev_Z_BYTE = Z_BYTE;
7965 Lisp_Object val; 7974 Lisp_Object val;
7975 Lisp_Object undo_list = BVAR (current_buffer, undo_list);
7976 ptrdiff_t count1 = SPECPDL_INDEX ();
7966 7977
7978 record_unwind_protect (coding_restore_undo_list,
7979 Fcons (undo_list, Fcurrent_buffer ()));
7980 bset_undo_list (current_buffer, Qt);
7967 TEMP_SET_PT_BOTH (coding->dst_pos, coding->dst_pos_byte); 7981 TEMP_SET_PT_BOTH (coding->dst_pos, coding->dst_pos_byte);
7968 val = call1 (CODING_ATTR_POST_READ (attrs), 7982 val = call1 (CODING_ATTR_POST_READ (attrs),
7969 make_number (coding->produced_char)); 7983 make_number (coding->produced_char));
7970 CHECK_NATNUM (val); 7984 CHECK_NATNUM (val);
7971 coding->produced_char += Z - prev_Z; 7985 coding->produced_char += Z - prev_Z;
7972 coding->produced += Z_BYTE - prev_Z_BYTE; 7986 coding->produced += Z_BYTE - prev_Z_BYTE;
7987 unbind_to (count1, Qnil);
7973 } 7988 }
7974 7989
7975 unbind_to (count, Qnil); 7990 unbind_to (count, Qnil);
@@ -8110,13 +8125,19 @@ decode_coding_object (struct coding_system *coding,
8110 { 8125 {
8111 ptrdiff_t prev_Z = Z, prev_Z_BYTE = Z_BYTE; 8126 ptrdiff_t prev_Z = Z, prev_Z_BYTE = Z_BYTE;
8112 Lisp_Object val; 8127 Lisp_Object val;
8128 Lisp_Object undo_list = BVAR (current_buffer, undo_list);
8129 ptrdiff_t count1 = SPECPDL_INDEX ();
8113 8130
8131 record_unwind_protect (coding_restore_undo_list,
8132 Fcons (undo_list, Fcurrent_buffer ()));
8133 bset_undo_list (current_buffer, Qt);
8114 TEMP_SET_PT_BOTH (coding->dst_pos, coding->dst_pos_byte); 8134 TEMP_SET_PT_BOTH (coding->dst_pos, coding->dst_pos_byte);
8115 val = safe_call1 (CODING_ATTR_POST_READ (attrs), 8135 val = safe_call1 (CODING_ATTR_POST_READ (attrs),
8116 make_number (coding->produced_char)); 8136 make_number (coding->produced_char));
8117 CHECK_NATNUM (val); 8137 CHECK_NATNUM (val);
8118 coding->produced_char += Z - prev_Z; 8138 coding->produced_char += Z - prev_Z;
8119 coding->produced += Z_BYTE - prev_Z_BYTE; 8139 coding->produced += Z_BYTE - prev_Z_BYTE;
8140 unbind_to (count1, Qnil);
8120 } 8141 }
8121 8142
8122 if (EQ (dst_object, Qt)) 8143 if (EQ (dst_object, Qt))