Mercurial > emacs
changeset 82790:346e6c150fa0
(byte-optimize-if): Move `progn' out of the test
so as to optimise cases where the `progn's result is constant.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Thu, 23 Aug 2007 19:56:16 +0000 |
parents | 4ca3b6194ff8 |
children | 25892386493b |
files | lisp/ChangeLog lisp/emacs-lisp/byte-opt.el |
diffstat | 2 files changed, 19 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Thu Aug 23 18:41:59 2007 +0000 +++ b/lisp/ChangeLog Thu Aug 23 19:56:16 2007 +0000 @@ -1,7 +1,12 @@ +2007-08-23 Stefan Monnier <monnier@iro.umontreal.ca> + + * emacs-lisp/byte-opt.el (byte-optimize-if): Move `progn' out of the test + so as to optimise cases where the `progn's result is constant. + 2007-08-23 Thien-Thi Nguyen <ttn@gnuvola.org> - * locate.el (locate-get-file-positions): Use - line-beginning-position and line-end-position. + * locate.el (locate-get-file-positions): + Use line-beginning-position and line-end-position. 2007-08-23 John Wiegley <johnw@newartisans.com>
--- a/lisp/emacs-lisp/byte-opt.el Thu Aug 23 18:41:59 2007 +0000 +++ b/lisp/emacs-lisp/byte-opt.el Thu Aug 23 19:56:16 2007 +0000 @@ -31,7 +31,7 @@ ;; "No matter how hard you try, you can't make a racehorse out of a pig. ;; You can, however, make a faster pig." ;; -;; Or, to put it another way, the emacs byte compiler is a VW Bug. This code +;; Or, to put it another way, the Emacs byte compiler is a VW Bug. This code ;; makes it be a VW Bug with fuel injection and a turbocharger... You're ;; still not going to make it go faster than 70 mph, but it might be easier ;; to get it there. @@ -1014,12 +1014,21 @@ form)) (defun byte-optimize-if (form) + ;; (if (progn <insts> <test>) <rest>) ==> (progn <insts> (if <test> <rest>)) ;; (if <true-constant> <then> <else...>) ==> <then> ;; (if <false-constant> <then> <else...>) ==> (progn <else...>) ;; (if <test> nil <else...>) ==> (if (not <test>) (progn <else...>)) ;; (if <test> <then> nil) ==> (if <test> <then>) (let ((clause (nth 1 form))) - (cond ((byte-compile-trueconstp clause) + (cond ((eq (car clause) 'progn) + (if (null (cddr clause)) + ;; A trivial `progn'. + (byte-optimize-if `(if ,(cadr clause) ,@(nthcdr 2 form))) + (nconc (butlast clause) + (list + (byte-optimize-if + `(if ,(car (last clause)) ,@(nthcdr 2 form))))))) + ((byte-compile-trueconstp clause) (nth 2 form)) ((null clause) (if (nthcdr 4 form) @@ -1326,7 +1335,7 @@ ;; This list contains numbers, which are pc values, ;; before each instruction. (defun byte-decompile-bytecode (bytes constvec) - "Turns BYTECODE into lapcode, referring to CONSTVEC." + "Turn BYTECODE into lapcode, referring to CONSTVEC." (let ((byte-compile-constants nil) (byte-compile-variables nil) (byte-compile-tag-number 0))