aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVibhav Pant2018-03-25 00:38:01 +0530
committerVibhav Pant2018-03-25 00:59:45 +0530
commita140513acb4ce27bd2b3472ee7a6ecb92676a8e9 (patch)
tree6b11b99d42e0c8a465e9344cdf676ebef60d724f
parent198de458f9fb4746199062e21ee89874c4f2b739 (diff)
downloademacs-a140513acb4ce27bd2b3472ee7a6ecb92676a8e9.tar.gz
emacs-a140513acb4ce27bd2b3472ee7a6ecb92676a8e9.zip
Optimize certain memq forms during byte-compilation.
* lisp/emacs-lisp/byte-opt.el (byte-optimize-memq): New function. Set the byte optimizer function for memq to byte-optimize-memq.
-rw-r--r--lisp/emacs-lisp/byte-opt.el18
1 files changed, 16 insertions, 2 deletions
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index a5e0e219644..54421e01be6 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -764,7 +764,23 @@
764 (if (= 1 (length (cdr form))) "" "s")) 764 (if (= 1 (length (cdr form))) "" "s"))
765 form)) 765 form))
766 766
767(defun byte-optimize-memq (form)
768 ;; (memq foo '(bar)) => (and (eq foo 'bar) '(bar))
769 (if (/= (length (cdr form)) 2)
770 (byte-compile-warn "memq called with %d arg%s, but requires 2"
771 (length (cdr form))
772 (if (= 1 (length (cdr form))) "" "s"))
773 (let ((list (nth 2 form)))
774 (when (and (eq (car-safe list) 'quote)
775 (listp (setq list (cadr list)))
776 (= (length list) 1))
777 (setq form `(and ,(byte-optimize-predicate
778 `(eq ,(nth 1 form) ',(nth 0 list)))
779 ',list))))
780 (byte-optimize-and form)))
781
767(put 'identity 'byte-optimizer 'byte-optimize-identity) 782(put 'identity 'byte-optimizer 'byte-optimize-identity)
783(put 'memq 'byte-optimizer 'byte-optimize-memq)
768 784
769(put '+ 'byte-optimizer 'byte-optimize-plus) 785(put '+ 'byte-optimizer 'byte-optimize-plus)
770(put '* 'byte-optimizer 'byte-optimize-multiply) 786(put '* 'byte-optimizer 'byte-optimize-multiply)
@@ -787,7 +803,6 @@
787(put '1- 'byte-optimizer 'byte-optimize-predicate) 803(put '1- 'byte-optimizer 'byte-optimize-predicate)
788(put 'not 'byte-optimizer 'byte-optimize-predicate) 804(put 'not 'byte-optimizer 'byte-optimize-predicate)
789(put 'null 'byte-optimizer 'byte-optimize-predicate) 805(put 'null 'byte-optimizer 'byte-optimize-predicate)
790(put 'memq 'byte-optimizer 'byte-optimize-predicate)
791(put 'consp 'byte-optimizer 'byte-optimize-predicate) 806(put 'consp 'byte-optimizer 'byte-optimize-predicate)
792(put 'listp 'byte-optimizer 'byte-optimize-predicate) 807(put 'listp 'byte-optimizer 'byte-optimize-predicate)
793(put 'symbolp 'byte-optimizer 'byte-optimize-predicate) 808(put 'symbolp 'byte-optimizer 'byte-optimize-predicate)
@@ -805,7 +820,6 @@
805(put 'car-safe 'byte-optimizer 'byte-optimize-predicate) 820(put 'car-safe 'byte-optimizer 'byte-optimize-predicate)
806(put 'cdr-safe 'byte-optimizer 'byte-optimize-predicate) 821(put 'cdr-safe 'byte-optimizer 'byte-optimize-predicate)
807 822
808
809;; I'm not convinced that this is necessary. Doesn't the optimizer loop 823;; I'm not convinced that this is necessary. Doesn't the optimizer loop
810;; take care of this? - Jamie 824;; take care of this? - Jamie
811;; I think this may some times be necessary to reduce ie (quote 5) to 5, 825;; I think this may some times be necessary to reduce ie (quote 5) to 5,