]> git.eshelyaron.com Git - emacs.git/commitdiff
Special-case symbol and fixnum keys in member, assoc and rassoc
authorMattias Engdegård <mattiase@acm.org>
Wed, 8 Jul 2020 09:22:19 +0000 (11:22 +0200)
committerMattias Engdegård <mattiase@acm.org>
Wed, 8 Jul 2020 16:13:47 +0000 (18:13 +0200)
* src/fns.c (Fmember, Fassoc, Frassoc): Delegate to the cheaper Fmemq,
Fassq and Frassq for arguments of the appropriate types.
(eq_comparable_value): New function.

src/fns.c

index a95a4b6e6782ff9e17d1b36cffc8154a0c2faee4..811d6e820015522cf450927e27894a84a43299ea 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -1530,11 +1530,21 @@ same_float (Lisp_Object x, Lisp_Object y)
   return !neql;
 }
 
+/* True if X can be compared using `eq'.
+   This predicate is approximative, for maximum speed.  */
+static bool
+eq_comparable_value (Lisp_Object x)
+{
+  return SYMBOLP (x) || FIXNUMP (x);
+}
+
 DEFUN ("member", Fmember, Smember, 2, 2, 0,
        doc: /* Return non-nil if ELT is an element of LIST.  Comparison done with `equal'.
 The value is actually the tail of LIST whose car is ELT.  */)
   (Lisp_Object elt, Lisp_Object list)
 {
+  if (eq_comparable_value (elt))
+    return Fmemq (elt, list);
   Lisp_Object tail = list;
   FOR_EACH_TAIL (tail)
     if (! NILP (Fequal (elt, XCAR (tail))))
@@ -1622,6 +1632,8 @@ The value is actually the first element of ALIST whose car equals KEY.
 Equality is defined by TESTFN if non-nil or by `equal' if nil.  */)
      (Lisp_Object key, Lisp_Object alist, Lisp_Object testfn)
 {
+  if (eq_comparable_value (key) && NILP (testfn))
+    return Fassq (key, alist);
   Lisp_Object tail = alist;
   FOR_EACH_TAIL (tail)
     {
@@ -1672,6 +1684,8 @@ DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0,
 The value is actually the first element of ALIST whose cdr equals KEY.  */)
   (Lisp_Object key, Lisp_Object alist)
 {
+  if (eq_comparable_value (key))
+    return Frassq (key, alist);
   Lisp_Object tail = alist;
   FOR_EACH_TAIL (tail)
     {