]> git.eshelyaron.com Git - emacs.git/commitdiff
Optimise assoc and rassoc with symbol key to assq and rassq
authorMattias Engdegård <mattiase@acm.org>
Mon, 6 Jul 2020 10:51:04 +0000 (12:51 +0200)
committerMattias Engdegård <mattiase@acm.org>
Tue, 7 Jul 2020 15:55:20 +0000 (17:55 +0200)
This is the same transformation made for member to memq.

* lisp/emacs-lisp/byte-opt.el (byte-optimize-assoc): New function.
(assoc, rassoc): Set the byte-optimizer property.

lisp/emacs-lisp/byte-opt.el

index 646994a37c1c5d679bf40e28edac4cf1c4bb1e91..194ceee176ff9fdd254fc62c46a47ae6598bd11d 100644 (file)
     ;; Arity errors reported elsewhere.
     form))
 
+(defun byte-optimize-assoc (form)
+  ;; Replace 2-argument `assoc' with `assq', `rassoc' with `rassq',
+  ;; if the first arg is a symbol.
+  (if (and (= (length form) 3)
+           (byte-optimize--constant-symbol-p (nth 1 form)))
+      (cons (if (eq (car form) 'assoc) 'assq 'rassq)
+            (cdr form))
+    form))
+
 (defun byte-optimize-memq (form)
   ;; (memq foo '(bar)) => (and (eq foo 'bar) '(bar))
   (if (= (length (cdr form)) 2)
 (put 'memq 'byte-optimizer 'byte-optimize-memq)
 (put 'memql  'byte-optimizer 'byte-optimize-member)
 (put 'member 'byte-optimizer 'byte-optimize-member)
+(put 'assoc 'byte-optimizer 'byte-optimize-assoc)
+(put 'rassoc 'byte-optimizer 'byte-optimize-assoc)
 
 (put '+   'byte-optimizer 'byte-optimize-plus)
 (put '*   'byte-optimizer 'byte-optimize-multiply)