diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2019-07-02 18:54:36 -0400 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2019-07-02 18:54:36 -0400 |
commit | 9836030ddaa72c4c594bb64741ecfee6d0d2bcff (patch) | |
tree | b34e1866fdb4114718136f135d3d9f4e3d3e3a42 /src | |
parent | fe3676fe18577643d9d247db2e6c32691f3acf80 (diff) | |
download | emacs-9836030ddaa72c4c594bb64741ecfee6d0d2bcff.tar.gz emacs-9836030ddaa72c4c594bb64741ecfee6d0d2bcff.tar.bz2 emacs-9836030ddaa72c4c594bb64741ecfee6d0d2bcff.zip |
* src/json.c (Fjson_insert): Don't temporarily insert invalid bytes in buffer
Diffstat (limited to 'src')
-rw-r--r-- | src/json.c | 17 |
1 files changed, 8 insertions, 9 deletions
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); |