[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master ecb985c 1/2: Simplify bignum->intmax conversion
From: |
Paul Eggert |
Subject: |
[Emacs-diffs] master ecb985c 1/2: Simplify bignum->intmax conversion |
Date: |
Tue, 4 Sep 2018 22:16:04 -0400 (EDT) |
branch: master
commit ecb985c10d5241a65ab9552ebfcecaa150b35427
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>
Simplify bignum->intmax conversion
* src/lisp.h (integer_to_intmax, integer_to_uintmax): New functions.
* src/data.c (cons_to_unsigned, cons_to_signed)
(arith_driver):
* src/dbusbind.c (xd_extract_signed, xd_extract_unsigned):
* src/dispnew.c (sit_for):
* src/editfns.c (styled_format):
* src/emacs-module.c (module_extract_integer):
* src/fileio.c (file_offset):
* src/font.c (font_unparse_xlfd, Fopen_font):
* src/xdisp.c (calc_line_height_property):
* src/process.c (handle_child_signal):
---
src/data.c | 34 +++-------------------------------
src/dbusbind.c | 30 ++++++++++--------------------
src/dispnew.c | 26 +++++++++++++-------------
src/editfns.c | 19 +++++++------------
src/emacs-module.c | 12 ++++--------
src/fileio.c | 12 ++++--------
src/font.c | 19 +++++++------------
src/lisp.h | 33 +++++++++++++++++++++++++++++++++
src/process.c | 5 +++--
src/xdisp.c | 8 +++++---
10 files changed, 89 insertions(+), 109 deletions(-)
diff --git a/src/data.c b/src/data.c
index 7be2052..66f69e7 100644
--- a/src/data.c
+++ b/src/data.c
@@ -2653,17 +2653,7 @@ cons_to_unsigned (Lisp_Object c, uintmax_t max)
else
{
Lisp_Object hi = CONSP (c) ? XCAR (c) : c;
-
- if (FIXNUMP (hi))
- {
- val = XFIXNUM (hi);
- valid = 0 <= val;
- }
- else
- {
- val = bignum_to_uintmax (hi);
- valid = val != 0;
- }
+ valid = integer_to_uintmax (hi, &val);
if (valid && CONSP (c))
{
@@ -2724,17 +2714,7 @@ cons_to_signed (Lisp_Object c, intmax_t min, intmax_t
max)
else
{
Lisp_Object hi = CONSP (c) ? XCAR (c) : c;
-
- if (FIXNUMP (hi))
- {
- val = XFIXNUM (hi);
- valid = true;
- }
- else if (BIGNUMP (hi))
- {
- val = bignum_to_intmax (hi);
- valid = val != 0;
- }
+ valid = integer_to_intmax (hi, &val);
if (valid && CONSP (c))
{
@@ -2972,16 +2952,8 @@ arith_driver (enum arithop code, ptrdiff_t nargs,
Lisp_Object *args,
/* Set NEXT to the next value if it fits, else exit the loop. */
intmax_t next;
- if (FIXNUMP (val))
- next = XFIXNUM (val);
- else if (FLOATP (val))
+ if (! (INTEGERP (val) && integer_to_intmax (val, &next)))
break;
- else
- {
- next = bignum_to_intmax (val);
- if (next == 0)
- break;
- }
/* Set ACCUM to the next operation's result if it fits,
else exit the loop. */
diff --git a/src/dbusbind.c b/src/dbusbind.c
index 47346a7..9bc344e 100644
--- a/src/dbusbind.c
+++ b/src/dbusbind.c
@@ -520,12 +520,13 @@ static intmax_t
xd_extract_signed (Lisp_Object x, intmax_t lo, intmax_t hi)
{
CHECK_NUMBER (x);
- if (FIXNUMP (x))
+ if (INTEGERP (x))
{
- if (lo <= XFIXNUM (x) && XFIXNUM (x) <= hi)
- return XFIXNUM (x);
+ intmax_t i;
+ if (integer_to_intmax (x, &i) && lo <= i && i <= hi)
+ return i;
}
- else if (FLOATP (x))
+ else
{
double d = XFLOAT_DATA (x);
if (lo <= d && d < 1.0 + hi)
@@ -535,12 +536,6 @@ xd_extract_signed (Lisp_Object x, intmax_t lo, intmax_t hi)
return n;
}
}
- else if (! (MOST_NEGATIVE_FIXNUM <= lo && hi <= MOST_POSITIVE_FIXNUM))
- {
- intmax_t i = bignum_to_intmax (x);
- if (i != 0 && lo <= i && i <= hi)
- return i;
- }
if (xd_in_read_queued_messages)
Fthrow (Qdbus_error, Qnil);
@@ -553,12 +548,13 @@ static uintmax_t
xd_extract_unsigned (Lisp_Object x, uintmax_t hi)
{
CHECK_NUMBER (x);
- if (FIXNUMP (x))
+ if (INTEGERP (x))
{
- if (0 <= XFIXNUM (x) && XFIXNUM (x) <= hi)
- return XFIXNUM (x);
+ uintmax_t i;
+ if (integer_to_uintmax (x, &i) && i <= hi)
+ return i;
}
- else if (FLOATP (x))
+ else
{
double d = XFLOAT_DATA (x);
if (0 <= d && d < 1.0 + hi)
@@ -568,12 +564,6 @@ xd_extract_unsigned (Lisp_Object x, uintmax_t hi)
return n;
}
}
- else if (! (hi <= MOST_POSITIVE_FIXNUM))
- {
- uintmax_t i = bignum_to_uintmax (x);
- if (i != 0 && i <= hi)
- return i;
- }
if (xd_in_read_queued_messages)
Fthrow (Qdbus_error, Qnil);
diff --git a/src/dispnew.c b/src/dispnew.c
index bd24679..798413d 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -5765,20 +5765,20 @@ sit_for (Lisp_Object timeout, bool reading, int
display_option)
if (display_option > 1)
redisplay_preserve_echo_area (2);
- if (FIXNUMP (timeout))
+ if (INTEGERP (timeout))
{
- sec = XFIXNUM (timeout);
- if (sec <= 0)
- return Qt;
- nsec = 0;
- }
- else if (BIGNUMP (timeout))
- {
- if (NILP (Fnatnump (timeout)))
- return Qt;
- sec = bignum_to_intmax (timeout);
- if (sec == 0)
- sec = WAIT_READING_MAX;
+ if (integer_to_intmax (timeout, &sec))
+ {
+ if (sec <= 0)
+ return Qt;
+ sec = min (sec, WAIT_READING_MAX);
+ }
+ else
+ {
+ if (NILP (Fnatnump (timeout)))
+ return Qt;
+ sec = WAIT_READING_MAX;
+ }
nsec = 0;
}
else if (FLOATP (timeout))
diff --git a/src/editfns.c b/src/editfns.c
index 3b1c21a..4ea7025 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -4691,21 +4691,16 @@ styled_format (ptrdiff_t nargs, Lisp_Object *args, bool
message)
}
else
{
- if (FIXNUMP (arg))
- ldarg = XFIXNUM (arg);
- else
+ if (INTEGERP (arg))
{
- intmax_t iarg = bignum_to_intmax (arg);
- if (iarg != 0)
+ intmax_t iarg;
+ uintmax_t uarg;
+ if (integer_to_intmax (arg, &iarg))
ldarg = iarg;
+ else if (integer_to_uintmax (arg, &uarg))
+ ldarg = uarg;
else
- {
- uintmax_t uarg = bignum_to_uintmax (arg);
- if (uarg != 0)
- ldarg = uarg;
- else
- format_bignum_as_double = true;
- }
+ format_bignum_as_double = true;
}
if (!format_bignum_as_double)
{
diff --git a/src/emacs-module.c b/src/emacs-module.c
index 2ba5540..6155535 100644
--- a/src/emacs-module.c
+++ b/src/emacs-module.c
@@ -519,14 +519,10 @@ module_extract_integer (emacs_env *env, emacs_value n)
MODULE_FUNCTION_BEGIN (0);
Lisp_Object l = value_to_lisp (n);
CHECK_INTEGER (l);
- if (BIGNUMP (l))
- {
- intmax_t i = bignum_to_intmax (l);
- if (i == 0)
- xsignal1 (Qoverflow_error, l);
- return i;
- }
- return XFIXNUM (l);
+ intmax_t i;
+ if (! integer_to_intmax (l, &i))
+ xsignal1 (Qoverflow_error, l);
+ return i;
}
static emacs_value
diff --git a/src/fileio.c b/src/fileio.c
index a91bdaa..66b2333 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -3424,17 +3424,13 @@ read_non_regular_quit (Lisp_Object ignore)
static off_t
file_offset (Lisp_Object val)
{
- if (RANGED_FIXNUMP (0, val, TYPE_MAXIMUM (off_t)))
- return XFIXNUM (val);
-
- if (BIGNUMP (val))
+ if (INTEGERP (val))
{
- intmax_t v = bignum_to_intmax (val);
- if (0 < v && v <= TYPE_MAXIMUM (off_t))
+ intmax_t v;
+ if (integer_to_intmax (val, &v) && 0 <= v && v <= TYPE_MAXIMUM (off_t))
return v;
}
-
- if (FLOATP (val))
+ else if (FLOATP (val))
{
double v = XFLOAT_DATA (val);
if (0 <= v && v < 1.0 + TYPE_MAXIMUM (off_t))
diff --git a/src/font.c b/src/font.c
index e241458..50ec39a 100644
--- a/src/font.c
+++ b/src/font.c
@@ -1289,8 +1289,9 @@ font_unparse_xlfd (Lisp_Object font, int pixel_size, char
*name, int nbytes)
1 + DBL_MAX_10_EXP + 1)];
if (INTEGERP (val))
{
- intmax_t v = FIXNUMP (val) ? XFIXNUM (val) : bignum_to_intmax (val);
- if (! (0 < v && v <= TYPE_MAXIMUM (uprintmax_t)))
+ intmax_t v;
+ if (! (integer_to_intmax (val, &v)
+ && 0 < v && v <= TYPE_MAXIMUM (uprintmax_t)))
v = pixel_size;
if (v > 0)
{
@@ -4747,16 +4748,10 @@ DEFUN ("open-font", Fopen_font, Sopen_font, 1, 3, 0,
else
{
CHECK_NUMBER (size);
- if (BIGNUMP (size))
- {
- isize = bignum_to_intmax (size);
- if (isize == 0)
- args_out_of_range (font_entity, size);
- }
- else
- isize = (FLOATP (size)
- ? POINT_TO_PIXEL (XFLOAT_DATA (size), FRAME_RES_Y (f))
- : XFIXNUM (size));
+ if (FLOATP (size))
+ isize = POINT_TO_PIXEL (XFLOAT_DATA (size), FRAME_RES_Y (f));
+ else if (! integer_to_intmax (size, &isize))
+ args_out_of_range (font_entity, size);
if (! (INT_MIN <= isize && isize <= INT_MAX))
args_out_of_range (font_entity, size);
if (isize == 0)
diff --git a/src/lisp.h b/src/lisp.h
index d244bc0..78c25f9 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -3297,6 +3297,39 @@ extern Lisp_Object bignum_to_string (Lisp_Object, int);
extern Lisp_Object make_bignum_str (char const *, int);
extern Lisp_Object double_to_bignum (double);
+/* Converthe integer NUM to *N. Return true if successful, false
+ (possibly setting *N) otherwise. */
+INLINE bool
+integer_to_intmax (Lisp_Object num, intmax_t *n)
+{
+ if (FIXNUMP (num))
+ {
+ *n = XFIXNUM (num);
+ return true;
+ }
+ else
+ {
+ intmax_t i = bignum_to_intmax (num);
+ *n = i;
+ return i != 0;
+ }
+}
+INLINE bool
+integer_to_uintmax (Lisp_Object num, uintmax_t *n)
+{
+ if (FIXNUMP (num))
+ {
+ *n = XFIXNUM (num);
+ return 0 <= XFIXNUM (num);
+ }
+ else
+ {
+ uintmax_t i = bignum_to_uintmax (num);
+ *n = i;
+ return i != 0;
+ }
+}
+
/* Defined in data.c. */
extern _Noreturn void wrong_choice (Lisp_Object, Lisp_Object);
extern void notify_variable_watchers (Lisp_Object, Lisp_Object,
diff --git a/src/process.c b/src/process.c
index 9d03eb9..454278a 100644
--- a/src/process.c
+++ b/src/process.c
@@ -7055,8 +7055,9 @@ handle_child_signal (int sig)
xpid = XCAR (head);
if (all_pids_are_fixnums ? FIXNUMP (xpid) : INTEGERP (xpid))
{
- pid_t deleted_pid = (FIXNUMP (xpid) ? XFIXNUM (xpid)
- : bignum_to_intmax (xpid));
+ intmax_t deleted_pid;
+ bool ok = integer_to_intmax (xpid, &deleted_pid);
+ eassert (ok);
if (child_status_changed (deleted_pid, 0, 0))
{
if (STRINGP (XCDR (head)))
diff --git a/src/xdisp.c b/src/xdisp.c
index 0403366..47286e2 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -27910,10 +27910,12 @@ calc_line_height_property (struct it *it, Lisp_Object
val, struct font *font,
/* FIXME: Check for overflow in multiplication or conversion. */
if (FLOATP (val))
height = (int)(XFLOAT_DATA (val) * height);
- else if (FIXNUMP (val))
- height *= XFIXNUM (val);
else
- height *= bignum_to_intmax (val);
+ {
+ intmax_t v;
+ if (integer_to_intmax (val, &v))
+ height *= v;
+ }
return make_fixnum (height);
}