[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master a3b6c24: Rewrite json-encode-string
From: |
Dmitry Gutov |
Subject: |
[Emacs-diffs] master a3b6c24: Rewrite json-encode-string |
Date: |
Sun, 22 Mar 2015 22:51:07 +0000 |
branch: master
commit a3b6c249e9757761404c1f7a57de4217dcc2e583
Author: Dmitry Gutov <address@hidden>
Commit: Dmitry Gutov <address@hidden>
Rewrite json-encode-string
Fixes: debbugs:20154
* lisp/json.el (json-decode-char0): Delete this alias.
(json-encode-string): Rewrite to improve performance.
(json-encode-char): Fold into `json-encode-string'.
---
lisp/ChangeLog | 6 ++++++
lisp/json.el | 37 ++++++++++++++++++++-----------------
2 files changed, 26 insertions(+), 17 deletions(-)
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 52c6a72..2fc318a 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,9 @@
+2015-03-22 Dmitry Gutov <address@hidden>
+
+ * json.el (json-decode-char0): Delete this alias.
+ (json-encode-string): Rewrite to improve performance (bug#20154).
+ (json-encode-char): Fold into `json-encode-string'.
+
2015-03-22 Artur Malabarba <address@hidden>
* menu-bar.el (menu-bar-update-buffers): Count displayed buffers
diff --git a/lisp/json.el b/lisp/json.el
index 98974e6..fb0f62c 100644
--- a/lisp/json.el
+++ b/lisp/json.el
@@ -55,7 +55,6 @@
;; Compatibility code
-(defalias 'json-encode-char0 'encode-char)
(defalias 'json-decode-char0 'decode-char)
@@ -313,24 +312,28 @@ representation will be parsed correctly."
;; String encoding
-(defun json-encode-char (char)
- "Encode CHAR as a JSON string."
- (setq char (json-encode-char0 char 'ucs))
- (let ((control-char (car (rassoc char json-special-chars))))
- (cond
- ;; Special JSON character (\n, \r, etc.).
- (control-char
- (format "\\%c" control-char))
- ;; ASCIIish printable character.
- ((and (> char 31) (< char 127))
- (format "%c" char))
- ;; Fallback: UCS code point in \uNNNN form.
- (t
- (format "\\u%04x" char)))))
-
(defun json-encode-string (string)
"Return a JSON representation of STRING."
- (format "\"%s\"" (mapconcat 'json-encode-char string "")))
+ ;; Reimplement the meat of `replace-regexp-in-string', for
+ ;; performance (bug#20154).
+ (let ((l (length string))
+ (start 0)
+ res mb)
+ ;; Skip over ASCIIish printable characters.
+ (while (setq mb (string-match "[\"\\/\b\f\n\r\t]\\|[^ -~]" string start))
+ (let* ((c (aref string mb))
+ (special (rassq c json-special-chars)))
+ (push (substring string start mb) res)
+ (push (if special
+ ;; Special JSON character (\n, \r, etc.).
+ (string ?\\ (car special))
+ ;; Fallback: UCS code point in \uNNNN form.
+ (format "\\u%04x" c))
+ res)
+ (setq start (1+ mb))))
+ (push (substring string start l) res)
+ (push "\"" res)
+ (apply #'concat "\"" (nreverse res))))
(defun json-encode-key (object)
"Return a JSON representation of OBJECT.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master a3b6c24: Rewrite json-encode-string,
Dmitry Gutov <=