Backport fix for http://debbugs.gnu.org/17556 from trunk
authorLeo Liu <sdl.web@gmail.com>
Fri, 27 Jun 2014 04:10:04 +0000 (12:10 +0800)
committerLeo Liu <sdl.web@gmail.com>
Fri, 27 Jun 2014 04:10:04 +0000 (12:10 +0800)
* lisp/calc/calc.el (math-bignum): Handle most-negative-fixnum.

lisp/ChangeLog
lisp/calc/calc.el

index a2cb284..dcbb027 100644 (file)
@@ -1,3 +1,7 @@
+2014-06-27  Leo Liu  <sdl.web@gmail.com>
+
+       * calc/calc.el (math-bignum): Handle most-negative-fixnum.  (Bug#17556)
+
 2014-06-27  Glenn Morris  <rgm@gnu.org>
 
        * net/eww.el (eww-mode) <eww-current-title>: Make local.  (Bug#17860)
index ba1c7de..04d852e 100644 (file)
@@ -2773,9 +2773,18 @@ largest Emacs integer.")
 
 ;; Coerce integer A to be a bignum.  [B S]
 (defun math-bignum (a)
-  (if (>= a 0)
-      (cons 'bigpos (math-bignum-big a))
-    (cons 'bigneg (math-bignum-big (- a)))))
+  (cond
+   ((>= a 0)
+    (cons 'bigpos (math-bignum-big a)))
+   ((= a most-negative-fixnum)
+    ;; Note: cannot get the negation directly because
+    ;; (- most-negative-fixnum) is most-negative-fixnum.
+    ;;
+    ;; most-negative-fixnum := -most-positive-fixnum - 1
+    (math-sub (cons 'bigneg (math-bignum-big most-positive-fixnum))
+             1))
+   (t
+    (cons 'bigneg (math-bignum-big (- a))))))
 
 (defun math-bignum-big (a)   ; [L s]
   (if (= a 0)