emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/emacs-lisp/bytecomp.el,v


From: Chong Yidong
Subject: [Emacs-diffs] Changes to emacs/lisp/emacs-lisp/bytecomp.el,v
Date: Fri, 14 Nov 2008 18:08:11 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Chong Yidong <cyd>      08/11/14 18:08:11

Index: bytecomp.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/emacs-lisp/bytecomp.el,v
retrieving revision 2.242
retrieving revision 2.243
diff -u -b -r2.242 -r2.243
--- bytecomp.el 31 Jul 2008 05:33:45 -0000      2.242
+++ bytecomp.el 14 Nov 2008 18:08:10 -0000      2.243
@@ -3217,14 +3217,21 @@
 (defun byte-compile-associative (form)
   (if (cdr form)
       (let ((opcode (get (car form) 'byte-opcode))
-           (args (copy-sequence (cdr form))))
+           args)
+       (if (and (< 3 (length form))
+                (memq opcode (list (get '+ 'byte-opcode)
+                                   (get '* 'byte-opcode))))
+           ;; Don't use binary operations for > 2 operands, as that
+           ;; may cause overflow/truncation in float operations.
+           (byte-compile-normal-call form)
+         (setq args (copy-sequence (cdr form)))
        (byte-compile-form (car args))
        (setq args (cdr args))
        (or args (setq args '(0)
                       opcode (get '+ 'byte-opcode)))
        (dolist (arg args)
          (byte-compile-form arg)
-         (byte-compile-out opcode 0)))
+           (byte-compile-out opcode 0))))
     (byte-compile-constant (eval form))))
 
 
@@ -3303,24 +3310,30 @@
          ((byte-compile-normal-call form)))))
 
 (defun byte-compile-minus (form)
-  (if (null (setq form (cdr form)))
-      (byte-compile-constant 0)
-    (byte-compile-form (car form))
-    (if (cdr form)
-       (while (setq form (cdr form))
-         (byte-compile-form (car form))
+  (let ((len (length form)))
+    (cond
+     ((= 1 len) (byte-compile-constant 0))
+     ((= 2 len)
+      (byte-compile-form (cadr form))
+      (byte-compile-out 'byte-negate 0))
+     ((= 3 len) 
+      (byte-compile-form (nth 1 form))
+      (byte-compile-form (nth 2 form))
          (byte-compile-out 'byte-diff 0))
-      (byte-compile-out 'byte-negate 0))))
+     ;; Don't use binary operations for > 2 operands, as that may
+     ;; cause overflow/truncation in float operations.
+     (t (byte-compile-normal-call form)))))
 
 (defun byte-compile-quo (form)
   (let ((len (length form)))
     (cond ((<= len 2)
           (byte-compile-subr-wrong-args form "2 or more"))
+         ((= len 3)
+          (byte-compile-two-args form))
          (t
-          (byte-compile-form (car (setq form (cdr form))))
-          (while (setq form (cdr form))
-            (byte-compile-form (car form))
-            (byte-compile-out 'byte-quo 0))))))
+          ;; Don't use binary operations for > 2 operands, as that
+          ;; may cause overflow/truncation in float operations.
+          (byte-compile-normal-call form)))))
 
 (defun byte-compile-nconc (form)
   (let ((len (length form)))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]