]> git.eshelyaron.com Git - emacs.git/commitdiff
Optimize certain memq forms during byte-compilation.
authorVibhav Pant <vibhavp@gmail.com>
Sat, 24 Mar 2018 19:08:01 +0000 (00:38 +0530)
committerAndrew G Cohen <cohen@andy.bu.edu>
Tue, 11 Dec 2018 06:18:30 +0000 (14:18 +0800)
* lisp/emacs-lisp/byte-opt.el (byte-optimize-memq): New function.
  Set the byte optimizer function for memq to byte-optimize-memq.

lisp/emacs-lisp/byte-opt.el

index a5e0e2196448139c803e3021fdd1d3d7c683e159..54421e01be65e55f169f0e24285416689dff7900 100644 (file)
                       (if (= 1 (length (cdr form))) "" "s"))
     form))
 
+(defun byte-optimize-memq (form)
+  ;; (memq foo '(bar)) => (and (eq foo 'bar) '(bar))
+  (if (/= (length (cdr form)) 2)
+      (byte-compile-warn "memq called with %d arg%s, but requires 2"
+                        (length (cdr form))
+                        (if (= 1 (length (cdr form))) "" "s"))
+    (let ((list (nth 2 form)))
+      (when (and (eq (car-safe list) 'quote)
+                 (listp (setq list (cadr list)))
+                 (= (length list) 1))
+        (setq form `(and ,(byte-optimize-predicate
+                           `(eq ,(nth 1 form) ',(nth 0 list)))
+                         ',list))))
+    (byte-optimize-and form)))
+
 (put 'identity 'byte-optimizer 'byte-optimize-identity)
+(put 'memq 'byte-optimizer 'byte-optimize-memq)
 
 (put '+   'byte-optimizer 'byte-optimize-plus)
 (put '*   'byte-optimizer 'byte-optimize-multiply)
 (put '1-  'byte-optimizer 'byte-optimize-predicate)
 (put 'not 'byte-optimizer 'byte-optimize-predicate)
 (put 'null  'byte-optimizer 'byte-optimize-predicate)
-(put 'memq  'byte-optimizer 'byte-optimize-predicate)
 (put 'consp 'byte-optimizer 'byte-optimize-predicate)
 (put 'listp 'byte-optimizer 'byte-optimize-predicate)
 (put 'symbolp 'byte-optimizer 'byte-optimize-predicate)
 (put 'car-safe 'byte-optimizer 'byte-optimize-predicate)
 (put 'cdr-safe 'byte-optimizer 'byte-optimize-predicate)
 
-
 ;; I'm not convinced that this is necessary.  Doesn't the optimizer loop
 ;; take care of this? - Jamie
 ;; I think this may some times be necessary to reduce ie (quote 5) to 5,