diff lisp/cl-macs.el @ 5266:f9ec07abdbf9

Transform safe calls to (= X Y Z) to (and (= X Y) (= Y Z)); same for < > <= >= lisp/ChangeLog addition: 2010-09-16 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (= < > <= >=): When these functions are handed more than two arguments, and those arguments have no side effects, transform to a series of two argument calls, avoiding funcall in the byte-compiled code. * mule/mule-cmds.el (finish-set-language-environment): Take advantage of this change in a function called 256 times at startup.
author Aidan Kehoe <kehoea@parhasard.net>
date Thu, 16 Sep 2010 14:31:40 +0100
parents 0d436a78c514
children 90a0084b3541
line wrap: on
line diff
--- a/lisp/cl-macs.el	Thu Sep 16 14:10:44 2010 +0100
+++ b/lisp/cl-macs.el	Thu Sep 16 14:31:40 2010 +0100
@@ -3773,6 +3773,25 @@
         (string (cons 'concat (cddr form))))
     form))
 
+(map nil
+     #'(lambda (function)
+         ;; There are byte codes for the two-argument versions of these
+         ;; functions; if the form has more arguments and those arguments
+         ;; have no side effects, transform to a series of two-argument
+         ;; calls.
+         (put function 'cl-compiler-macro
+              #'(lambda (form &rest arguments)
+                  (if (or (null (nthcdr 3 form))
+                          (notevery #'cl-safe-expr-p (cdr form)))
+                      form
+                    (cons 'and (mapcon
+                                #'(lambda (rest)
+                                    (and (cdr rest)
+                                         `((,(car form) ,(pop rest)
+                                            ,(car rest)))))
+                                (cdr form)))))))
+     '(= < > <= >=))
+
 (mapc
  #'(lambda (y)
      (put (car y) 'side-effect-free t)