]> git.eshelyaron.com Git - emacs.git/commitdiff
Bignum fixes for byte-compiler and bytecode interpreter
authorTom Tromey <tom@tromey.com>
Sun, 8 Jul 2018 15:36:37 +0000 (09:36 -0600)
committerTom Tromey <tom@tromey.com>
Fri, 13 Jul 2018 04:12:28 +0000 (22:12 -0600)
* 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.

lisp/emacs-lisp/byte-opt.el
src/bytecode.c

index 5c0b5e340bb70cfcf72a0138d645fe4f1e7f3c35..1920503b8c48f9b15fdfc0616e910fd2fbe38524 100644 (file)
         window-width zerop))
       (side-effect-and-error-free-fns
        '(arrayp atom
-        bobp bolp bool-vector-p
+        bignump bobp bolp bool-vector-p
         buffer-end buffer-list buffer-size buffer-string bufferp
         car-safe case-table-p cdr-safe char-or-string-p characterp
         charsetp commandp cons consp
         current-buffer current-global-map current-indentation
         current-local-map current-minor-mode-maps current-time
         eobp eolp eq equal eventp
-        floatp following-char framep
+        fixnump floatp following-char framep
         get-largest-window get-lru-window
         hash-table-p
         identity ignore integerp integer-or-marker-p interactive-p
index 282754d22b6e294d5ba2615db7cff3474894585c..f87983a59c05763f9398c0876447dc6b16a2d9db 100644 (file)
@@ -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