diff options
| author | Vibhav Pant | 2018-03-25 00:38:01 +0530 |
|---|---|---|
| committer | Vibhav Pant | 2018-03-25 00:59:45 +0530 |
| commit | a140513acb4ce27bd2b3472ee7a6ecb92676a8e9 (patch) | |
| tree | 6b11b99d42e0c8a465e9344cdf676ebef60d724f | |
| parent | 198de458f9fb4746199062e21ee89874c4f2b739 (diff) | |
| download | emacs-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.el | 18 |
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, |