From: Stefan Monnier Date: Tue, 2 Jul 2019 22:54:36 +0000 (-0400) Subject: * src/json.c (Fjson_insert): Don't temporarily insert invalid bytes in buffer X-Git-Tag: emacs-27.0.90~2117 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=9836030ddaa72c4c594bb64741ecfee6d0d2bcff;p=emacs.git * src/json.c (Fjson_insert): Don't temporarily insert invalid bytes in buffer --- diff --git a/src/json.c b/src/json.c index 607b8d32646..21c4b946b4e 100644 --- a/src/json.c +++ b/src/json.c @@ -739,9 +739,6 @@ usage: (json-insert OBJECT &rest ARGS) */) ptrdiff_t inserted_bytes = data.inserted_bytes; if (inserted_bytes > 0) { - /* Make the inserted text part of the buffer, as unibyte text. */ - insert_from_gap_1 (inserted_bytes, inserted_bytes, false); - /* If required, decode the stuff we've read into the gap. */ struct coding_system coding; /* JSON strings are UTF-8 encoded strings. If for some reason @@ -753,17 +750,19 @@ usage: (json-insert OBJECT &rest ARGS) */) !NILP (BVAR (current_buffer, enable_multibyte_characters)); if (CODING_MAY_REQUIRE_DECODING (&coding)) { - move_gap_both (PT, PT_BYTE); - GAP_SIZE += inserted_bytes; - ZV_BYTE -= inserted_bytes; - Z_BYTE -= inserted_bytes; - ZV -= inserted_bytes; - Z -= inserted_bytes; + /* Now we have all the new bytes at the beginning of the gap, + but `decode_coding_gap` needs them at the end of the gap, so + we need to move them. */ + memmove (GAP_END_ADDR - inserted_bytes, GPT_ADDR, inserted_bytes); decode_coding_gap (&coding, inserted_bytes); inserted = coding.produced_char; } else { + /* Make the inserted text part of the buffer, as unibyte text. */ + eassert (NILP (BVAR (current_buffer, enable_multibyte_characters))); + insert_from_gap_1 (inserted_bytes, inserted_bytes, false); + /* The target buffer is unibyte, so we don't need to decode. */ invalidate_buffer_caches (current_buffer, PT, PT + inserted_bytes);