emacs-diffs
[Top][All Lists]
Advanced

[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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]