emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master a82785e2978 2/3: Reorder type tests for efficiency


From: Mattias Engdegård
Subject: master a82785e2978 2/3: Reorder type tests for efficiency
Date: Wed, 20 Sep 2023 05:50:03 -0400 (EDT)

branch: master
commit a82785e29785f070465c5db10953ecebca49e257
Author: Mattias Engdegård <mattiase@acm.org>
Commit: Mattias Engdegård <mattiase@acm.org>

    Reorder type tests for efficiency
    
    * src/fns.c (Flength, Fdelete, Fnreverse):
    Test types in descending order of frequency, roughly.
---
 src/fns.c | 52 ++++++++++++++++++++++++++++------------------------
 1 file changed, 28 insertions(+), 24 deletions(-)

diff --git a/src/fns.c b/src/fns.c
index 4731e416125..a3f89637dfd 100644
--- 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;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]