From: "Mattias Engdegård" <mattias.engdegard@gmail.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: casouri@gmail.com, 70007@debbugs.gnu.org
Subject: bug#70007: [PATCH] native JSON encoder
Date: Tue, 2 Apr 2024 16:13:58 +0200 [thread overview]
Message-ID: <4C93E902-282D-4408-B449-C8E771B2B3E4@gmail.com> (raw)
In-Reply-To: <E07F73AC-A127-4E6D-A86F-0FB303F2BB48@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 708 bytes --]
Looks like the new serialiser inherited a bug from the old code: `json-insert` in a unibyte buffer does not move point correctly. Example:
(with-temp-buffer
(set-buffer-multibyte nil)
(json-insert "é")
(list (buffer-string) (point)))
=> ("\"\303\251\"" 4)
The string is correct but the position should be 5, not 4.
This made me look at the Fjson_insert logic a bit. I'm probably betraying my lack of knowledge about buffer subtleties here, but since the serialiser always produces (correct) UTF-8, shouldn't it be enough to copy the bytes, don't bother with any decoding, and perform the buffer insertion ceremonies?
Proposed patch attached. (There will also be a test, of course.)
[-- Attachment #2: json-insert.diff --]
[-- Type: application/octet-stream, Size: 2025 bytes --]
diff --git a/src/json.c b/src/json.c
index c3244ad04d2..7c62d63c6fd 100644
--- a/src/json.c
+++ b/src/json.c
@@ -656,39 +656,14 @@ DEFUN ("json-insert", Fjson_insert, Sjson_insert, 1, MANY,
/* No need to keep allocation beyond this point. */
unbind_to (count, Qnil);
- ptrdiff_t inserted = 0;
+ bool ub_buffer = NILP (BVAR (current_buffer, enable_multibyte_characters));
ptrdiff_t inserted_bytes = jo.size;
+ ptrdiff_t inserted = ub_buffer ? jo.size : jo.size - jo.chars_delta;
- /* If required, decode the stuff we've read into the gap. */
- struct coding_system coding;
- /* JSON strings are UTF-8 encoded strings. */
- setup_coding_system (Qutf_8_unix, &coding);
- coding.dst_multibyte = !NILP (BVAR (current_buffer,
- enable_multibyte_characters));
- if (CODING_MAY_REQUIRE_DECODING (&coding))
- {
- /* 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);
- adjust_after_insert (PT, PT_BYTE,
- PT + inserted_bytes,
- PT_BYTE + inserted_bytes,
- inserted_bytes);
- inserted = inserted_bytes;
- }
+ insert_from_gap_1 (inserted, inserted_bytes, false);
+ invalidate_buffer_caches (current_buffer, PT, PT + inserted);
+ adjust_after_insert (PT, PT_BYTE, PT + inserted, PT_BYTE + inserted_bytes,
+ inserted);
/* Call after-change hooks. */
signal_after_change (PT, 0, inserted);
next prev parent reply other threads:[~2024-04-02 14:13 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-26 15:33 bug#70007: [PATCH] native JSON encoder Mattias Engdegård
2024-03-26 16:46 ` Eli Zaretskii
2024-03-27 12:46 ` Mattias Engdegård
2024-03-27 15:49 ` Mattias Engdegård
2024-03-27 17:40 ` Eli Zaretskii
2024-03-27 18:57 ` Mattias Engdegård
2024-03-27 19:05 ` Eli Zaretskii
2024-03-28 20:59 ` Mattias Engdegård
2024-03-29 6:04 ` Eli Zaretskii
2024-03-30 11:41 ` Mattias Engdegård
2024-03-30 13:22 ` Eli Zaretskii
2024-03-30 14:22 ` Mattias Engdegård
2024-03-30 16:14 ` Richard Copley
2024-03-30 16:40 ` Eli Zaretskii
2024-03-30 23:29 ` Richard Copley
2024-03-30 16:45 ` Andy Moreton
2024-03-30 20:36 ` Corwin Brust
2024-03-30 16:37 ` Eli Zaretskii
2024-03-30 20:21 ` Mattias Engdegård
2024-04-02 14:13 ` Mattias Engdegård [this message]
2024-04-02 16:13 ` Eli Zaretskii
2024-04-02 17:19 ` Mattias Engdegård
2024-08-24 15:33 ` Mattias Engdegård
2024-08-24 16:14 ` Eli Zaretskii
2024-08-24 19:45 ` Mattias Engdegård
2024-08-25 5:07 ` Eli Zaretskii
2024-08-25 17:55 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-08-25 18:26 ` Eli Zaretskii
2024-08-25 19:20 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-08-31 22:15 ` Stefan Kangas
2024-09-07 7:26 ` Eli Zaretskii
2024-09-07 15:48 ` Andrea Corallo
2024-09-07 15:52 ` Eli Zaretskii
2024-09-08 18:33 ` Mattias Engdegård
2024-08-25 20:08 ` Mattias Engdegård
2024-08-31 9:45 ` Eli Zaretskii
2024-03-28 19:16 ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4C93E902-282D-4408-B449-C8E771B2B3E4@gmail.com \
--to=mattias.engdegard@gmail.com \
--cc=70007@debbugs.gnu.org \
--cc=casouri@gmail.com \
--cc=eliz@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).