]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/emacs-lisp/bytecomp.el (byte-compile-and-folded): Optimize case where
authorStefan Monnier <monnier@iro.umontreal.ca>
Wed, 22 Oct 2014 13:38:47 +0000 (09:38 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Wed, 22 Oct 2014 13:38:47 +0000 (09:38 -0400)
all args are copyable.
(=, <, >, <=, >=): Re-enable the optimization.

Fixes: debbugs:18767
lisp/ChangeLog
lisp/emacs-lisp/bytecomp.el

index a23b2fc4012b4ee0e9851b34309eab757638aeb1..d1f8fdcdd584301234e6e9a25a5a2fccae42640e 100644 (file)
@@ -1,3 +1,9 @@
+2014-10-22  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * emacs-lisp/bytecomp.el (byte-compile-and-folded): Optimize case where
+       all args are copyable (bug#18767).
+       (=, <, >, <=, >=): Re-enable the optimization.
+
 2014-10-20  Santiago PayĆ  i Miralta  <santiagopim@gmail.com>
 
        * vc/vc-hg.el (vc-hg-log-graph): New var.
index 69c4e0f1628774b41afb80fbf1c72fc557a8fe2a..6ab0efff86b1213801dae96fe39eb8c53c0c809b 100644 (file)
 (require 'backquote)
 (require 'macroexp)
 (require 'cconv)
-(eval-when-compile (require 'cl-lib))
+(require 'cl-lib)
 
 (or (fboundp 'defsubst)
     ;; This really ought to be loaded already!
@@ -3261,11 +3261,11 @@ If it is nil, then the handler is \"byte-compile-SYMBOL.\""
 (byte-defop-compiler cons              2)
 (byte-defop-compiler aref              2)
 (byte-defop-compiler set               2)
-(byte-defop-compiler (= byte-eqlsign)  2) ;; -and  bug#18767
-(byte-defop-compiler (< byte-lss)      2) ;; -and  bug#18767
-(byte-defop-compiler (> byte-gtr)      2) ;; -and  bug#18767
-(byte-defop-compiler (<= byte-leq)     2) ;; -and  bug#18767
-(byte-defop-compiler (>= byte-geq)     2) ;; -and  bug#18767
+(byte-defop-compiler (= byte-eqlsign)  2-and)
+(byte-defop-compiler (< byte-lss)      2-and)
+(byte-defop-compiler (> byte-gtr)      2-and)
+(byte-defop-compiler (<= byte-leq)     2-and)
+(byte-defop-compiler (>= byte-geq)     2-and)
 (byte-defop-compiler get               2)
 (byte-defop-compiler nth               2)
 (byte-defop-compiler substring         2-3)
@@ -3332,13 +3332,14 @@ If it is nil, then the handler is \"byte-compile-SYMBOL.\""
 (defun byte-compile-and-folded (form)
   "Compile calls to functions like `<='.
 These implicitly `and' together a bunch of two-arg bytecodes."
-  ;; FIXME: bug#18767 means we can't do it this way!
   (let ((l (length form)))
     (cond
      ((< l 3) (byte-compile-form `(progn ,(nth 1 form) t)))
      ((= l 3) (byte-compile-two-args form))
-     (t (byte-compile-form `(and (,(car form) ,(nth 1 form) ,(nth 2 form))
-                                (,(car form) ,@(nthcdr 2 form))))))))
+     ((cl-every #'macroexp-copyable-p (nthcdr 2 form))
+      (byte-compile-form `(and (,(car form) ,(nth 1 form) ,(nth 2 form))
+                              (,(car form) ,@(nthcdr 2 form)))))
+     (t (byte-compile-normal-call form)))))
 
 (defun byte-compile-three-args (form)
   (if (not (= (length form) 4))