summaryrefslogtreecommitdiff
path: root/src/bytecode.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2018-07-08 09:36:37 -0600
committerTom Tromey <tom@tromey.com>2018-07-12 22:12:28 -0600
commite2a78b0d6d844f29acaaddd775c7b1cd6dec7af8 (patch)
treed8dcd1bac51c66f828cbd0f980ab1d206626491e /src/bytecode.c
parent45eb3b3513619d97d046a8efbe0d16fafc75a734 (diff)
downloademacs-e2a78b0d6d844f29acaaddd775c7b1cd6dec7af8.tar.gz
Bignum fixes for byte-compiler and bytecode interpreter
* lisp/emacs-lisp/byte-opt.el: Mark bignump and fixnump as side-effect-and-error-free-fns. * src/bytecode.c (exec_byte_code): Handle bignums.
Diffstat (limited to 'src/bytecode.c')
-rw-r--r--src/bytecode.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/bytecode.c b/src/bytecode.c
index 282754d22b6..f87983a59c0 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -972,11 +972,15 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
NEXT;
CASE (Bsub1):
- TOP = FIXNUMP (TOP) ? make_fixnum (XINT (TOP) - 1) : Fsub1 (TOP);
+ TOP = (FIXNUMP (TOP) && XINT (TOP) != MOST_NEGATIVE_FIXNUM
+ ? make_fixnum (XINT (TOP) - 1)
+ : Fsub1 (TOP));
NEXT;
CASE (Badd1):
- TOP = FIXNUMP (TOP) ? make_fixnum (XINT (TOP) + 1) : Fadd1 (TOP);
+ TOP = (FIXNUMP (TOP) && XINT (TOP) != MOST_POSITIVE_FIXNUM
+ ? make_fixnum (XINT (TOP) + 1)
+ : Fadd1 (TOP));
NEXT;
CASE (Beqlsign):
@@ -1027,7 +1031,9 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
NEXT;
CASE (Bnegate):
- TOP = FIXNUMP (TOP) ? make_fixnum (- XINT (TOP)) : Fminus (1, &TOP);
+ TOP = (FIXNUMP (TOP) && XINT (TOP) != MOST_NEGATIVE_FIXNUM
+ ? make_fixnum (- XINT (TOP))
+ : Fminus (1, &TOP));
NEXT;
CASE (Bplus):
@@ -1324,11 +1330,11 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
NEXT;
CASE (Bnumberp):
- TOP = FIXED_OR_FLOATP (TOP) ? Qt : Qnil;
+ TOP = NUMBERP (TOP) ? Qt : Qnil;
NEXT;
CASE (Bintegerp):
- TOP = FIXNUMP (TOP) ? Qt : Qnil;
+ TOP = INTEGERP (TOP) ? Qt : Qnil;
NEXT;
#if BYTE_CODE_SAFE