]> git.eshelyaron.com Git - emacs.git/commitdiff
Reorder type tests for efficiency
authorMattias Engdegård <mattiase@acm.org>
Wed, 20 Sep 2023 08:34:12 +0000 (10:34 +0200)
committerMattias Engdegård <mattiase@acm.org>
Wed, 20 Sep 2023 09:30:31 +0000 (11:30 +0200)
* src/fns.c (Flength, Fdelete, Fnreverse):
Test types in descending order of frequency, roughly.

src/fns.c

index 4731e4161259442e757006b11cd5c9c731a0f436..a3f89637dfd5d5995fa2a2cc2242f4f605b4e57c 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -141,6 +141,10 @@ efficient.  */)
 
   if (STRINGP (sequence))
     val = SCHARS (sequence);
+  else if (CONSP (sequence))
+    val = list_length (sequence);
+  else if (NILP (sequence))
+    val = 0;
   else if (VECTORP (sequence))
     val = ASIZE (sequence);
   else if (CHAR_TABLE_P (sequence))
@@ -149,10 +153,6 @@ efficient.  */)
     val = bool_vector_size (sequence);
   else if (COMPILEDP (sequence) || RECORDP (sequence))
     val = PVSIZE (sequence);
-  else if (CONSP (sequence))
-    val = list_length (sequence);
-  else if (NILP (sequence))
-    val = 0;
   else
     wrong_type_argument (Qsequencep, sequence);
 
@@ -2104,7 +2104,27 @@ changing the value of a sequence `foo'.  See also `remove', which
 does not modify the argument.  */)
   (Lisp_Object elt, Lisp_Object seq)
 {
-  if (VECTORP (seq))
+  if (NILP (seq))
+    ;
+  else if (CONSP (seq))
+    {
+      Lisp_Object prev = Qnil, tail = seq;
+
+      FOR_EACH_TAIL (tail)
+       {
+         if (!NILP (Fequal (elt, XCAR (tail))))
+           {
+             if (NILP (prev))
+               seq = XCDR (tail);
+             else
+               Fsetcdr (prev, XCDR (tail));
+           }
+         else
+           prev = tail;
+       }
+      CHECK_LIST_END (tail, seq);
+    }
+  else if (VECTORP (seq))
     {
       ptrdiff_t n = 0;
       ptrdiff_t size = ASIZE (seq);
@@ -2193,23 +2213,7 @@ does not modify the argument.  */)
        }
     }
   else
-    {
-      Lisp_Object prev = Qnil, tail = seq;
-
-      FOR_EACH_TAIL (tail)
-       {
-         if (!NILP (Fequal (elt, XCAR (tail))))
-           {
-             if (NILP (prev))
-               seq = XCDR (tail);
-             else
-               Fsetcdr (prev, XCDR (tail));
-           }
-         else
-           prev = tail;
-       }
-      CHECK_LIST_END (tail, seq);
-    }
+    wrong_type_argument (Qsequencep, seq);
 
   return seq;
 }
@@ -2222,8 +2226,6 @@ This function may destructively modify SEQ to produce the value.  */)
 {
   if (NILP (seq))
     return seq;
-  else if (STRINGP (seq))
-    return Freverse (seq);
   else if (CONSP (seq))
     {
       Lisp_Object prev, tail, next;
@@ -2263,6 +2265,8 @@ This function may destructively modify SEQ to produce the value.  */)
          bool_vector_set (seq, size - i - 1, tem);
        }
     }
+  else if (STRINGP (seq))
+    return Freverse (seq);
   else
     wrong_type_argument (Qarrayp, seq);
   return seq;