]> git.eshelyaron.com Git - emacs.git/commitdiff
Support bignums when serializing JSON
authorPhilipp Stephani <phst@google.com>
Fri, 21 Sep 2018 19:50:56 +0000 (21:50 +0200)
committerPhilipp Stephani <phst@google.com>
Fri, 21 Sep 2018 19:50:56 +0000 (21:50 +0200)
* src/json.c (lisp_to_json): Support bignums.
* test/src/json-tests.el (json-serialize/bignum): New test.

src/json.c
test/src/json-tests.el

index 976783d785c21786f80b6098062b1b7a33c0be18..8b365e3795cd783290003648538f6c65be004048 100644 (file)
@@ -488,10 +488,14 @@ lisp_to_json (Lisp_Object lisp, struct json_configuration *conf)
     return json_check (json_false ());
   else if (EQ (lisp, Qt))
     return json_check (json_true ());
-  else if (FIXNUMP (lisp))
+  else if (INTEGERP (lisp))
     {
-      CHECK_TYPE_RANGED_INTEGER (json_int_t, lisp);
-      return json_check (json_integer (XFIXNUM (lisp)));
+      intmax_t low = TYPE_MINIMUM (json_int_t);
+      intmax_t high = TYPE_MAXIMUM (json_int_t);
+      intmax_t value;
+      if (! integer_to_intmax (lisp, &value) || value < low || high < value)
+        args_out_of_range_3 (lisp, make_int (low), make_int (high));
+      return json_check (json_integer (value));
     }
   else if (FLOATP (lisp))
     return json_check (json_real (XFLOAT_DATA (lisp)));
index 8bd679b886ef8f57e4a6c86deae5e65dd8e5dfff..911bc49730d71ef200aa8afbb902fee0899a3ca8 100644 (file)
@@ -278,5 +278,13 @@ Test with both unibyte and multibyte strings."
        :type 'no-catch)
       (should (equal calls 1)))))
 
+(ert-deftest json-serialize/bignum ()
+  (skip-unless (fboundp 'json-serialize))
+  (should (equal (json-serialize (vector (1+ most-positive-fixnum)
+                                         (1- most-negative-fixnum)))
+                 (format "[%d,%d]"
+                         (1+ most-positive-fixnum)
+                         (1- most-negative-fixnum)))))
+
 (provide 'json-tests)
 ;;; json-tests.el ends here