From: Stefan Monnier Date: Wed, 22 Oct 2014 13:38:47 +0000 (-0400) Subject: * lisp/emacs-lisp/bytecomp.el (byte-compile-and-folded): Optimize case where X-Git-Tag: emacs-24.4.90~320 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=be603ee9b653b14f62bb1bbcc6bded35e76f3ee7;p=emacs.git * lisp/emacs-lisp/bytecomp.el (byte-compile-and-folded): Optimize case where all args are copyable. (=, <, >, <=, >=): Re-enable the optimization. Fixes: debbugs:18767 --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index a23b2fc4012..d1f8fdcdd58 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2014-10-22 Stefan Monnier + + * 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 * vc/vc-hg.el (vc-hg-log-graph): New var. diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index 69c4e0f1628..6ab0efff86b 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -120,7 +120,7 @@ (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))