]> git.eshelyaron.com Git - emacs.git/commitdiff
Introduce a helper macro to convert a Lisp integer to a C integer.
authorPhilipp Stephani <phst@google.com>
Mon, 22 Apr 2019 15:29:06 +0000 (17:29 +0200)
committerPhilipp Stephani <phst@google.com>
Mon, 22 Apr 2019 15:36:52 +0000 (17:36 +0200)
This is similar to CONS_TO_INTEGER.  The inverse (INT_TO_INTEGER)
already exists.

* src/lisp.h (INTEGER_TO_INT): New macro.
(ranged_integer_to_int, ranged_integer_to_uint): New
functions.

* src/json.c (lisp_to_json): Use helper macro.

src/json.c
src/lisp.h

index 928825e034c4254892aa5ff09f94b994c80a121e..16500bce72d2d42a4e50a85c67801df337f797e6 100644 (file)
@@ -495,14 +495,7 @@ lisp_to_json (Lisp_Object lisp, struct json_configuration *conf)
   else if (EQ (lisp, Qt))
     return json_check (json_true ());
   else if (INTEGERP (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));
-    }
+    return json_check (json_integer (INTEGER_TO_INT (lisp, json_int_t)));
   else if (FLOATP (lisp))
     return json_check (json_real (XFLOAT_DATA (lisp)));
   else if (STRINGP (lisp))
index d803f1600061be2aff7f3678436f935c0815dae2..8510ad72564b526ff14b4f3f87b215cbd7e3a25d 100644 (file)
@@ -2640,6 +2640,13 @@ make_uint (uintmax_t n)
 #define INT_TO_INTEGER(expr) \
   (EXPR_SIGNED (expr) ? make_int (expr) : make_uint (expr))
 
+/* Return the integral value of NUM.  If NUM is too big for TYPE,
+   signal an error.  */
+#define INTEGER_TO_INT(num, type)                                              \
+  (TYPE_SIGNED (type)                                                          \
+     ? ranged_integer_to_int ((num), TYPE_MINIMUM (type), TYPE_MAXIMUM (type)) \
+     : ranged_integer_to_uint ((num), TYPE_MINIMUM (type)))
+
 \f
 /* Forwarding pointer to an int variable.
    This is allowed only in the value cell of a symbol,
@@ -5016,6 +5023,26 @@ maybe_gc (void)
     garbage_collect ();
 }
 
+INLINE intmax_t
+ranged_integer_to_int (Lisp_Object num, intmax_t min, intmax_t max)
+{
+  CHECK_INTEGER (num);
+  intmax_t result;
+  if (!(integer_to_intmax (num, &result) && min <= result && result <= max))
+    args_out_of_range_3 (num, make_int (min), make_int (max));
+  return result;
+}
+
+INLINE uintmax_t
+ranged_integer_to_uint (Lisp_Object num, uintmax_t max)
+{
+  CHECK_INTEGER (num);
+  uintmax_t result;
+  if (!(integer_to_uintmax (num, &result) && result <= max))
+    args_out_of_range_3 (num, make_fixed_natnum (0), make_uint (max));
+  return result;
+}
+
 INLINE_HEADER_END
 
 #endif /* EMACS_LISP_H */