aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMattias EngdegÄrd2022-06-16 16:04:48 +0200
committerMattias EngdegÄrd2022-06-16 16:04:48 +0200
commita0f7d81a8dfefc20a283585dca3a37240a2b7a9a (patch)
treeea80628d22b1ccbe77ee988596b8cdd3494094d5 /src
parent946d70a8910a827d74a384ff6421b9e952e0df2e (diff)
downloademacs-a0f7d81a8dfefc20a283585dca3a37240a2b7a9a.tar.gz
emacs-a0f7d81a8dfefc20a283585dca3a37240a2b7a9a.zip
* src/fns.c (mapcar1): Test types in rough order of likelyhood.
Diffstat (limited to 'src')
-rw-r--r--src/fns.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/src/fns.c b/src/fns.c
index 97af39c4161..4df944507c7 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -2757,20 +2757,26 @@ usage: (nconc &rest LISTS) */)
2757static EMACS_INT 2757static EMACS_INT
2758mapcar1 (EMACS_INT leni, Lisp_Object *vals, Lisp_Object fn, Lisp_Object seq) 2758mapcar1 (EMACS_INT leni, Lisp_Object *vals, Lisp_Object fn, Lisp_Object seq)
2759{ 2759{
2760 if (VECTORP (seq) || COMPILEDP (seq)) 2760 if (NILP (seq))
2761 return 0;
2762 else if (CONSP (seq))
2761 { 2763 {
2764 Lisp_Object tail = seq;
2762 for (ptrdiff_t i = 0; i < leni; i++) 2765 for (ptrdiff_t i = 0; i < leni; i++)
2763 { 2766 {
2764 Lisp_Object dummy = call1 (fn, AREF (seq, i)); 2767 if (! CONSP (tail))
2768 return i;
2769 Lisp_Object dummy = call1 (fn, XCAR (tail));
2765 if (vals) 2770 if (vals)
2766 vals[i] = dummy; 2771 vals[i] = dummy;
2772 tail = XCDR (tail);
2767 } 2773 }
2768 } 2774 }
2769 else if (BOOL_VECTOR_P (seq)) 2775 else if (VECTORP (seq) || COMPILEDP (seq))
2770 { 2776 {
2771 for (EMACS_INT i = 0; i < leni; i++) 2777 for (ptrdiff_t i = 0; i < leni; i++)
2772 { 2778 {
2773 Lisp_Object dummy = call1 (fn, bool_vector_ref (seq, i)); 2779 Lisp_Object dummy = call1 (fn, AREF (seq, i));
2774 if (vals) 2780 if (vals)
2775 vals[i] = dummy; 2781 vals[i] = dummy;
2776 } 2782 }
@@ -2788,17 +2794,14 @@ mapcar1 (EMACS_INT leni, Lisp_Object *vals, Lisp_Object fn, Lisp_Object seq)
2788 vals[i_before] = dummy; 2794 vals[i_before] = dummy;
2789 } 2795 }
2790 } 2796 }
2791 else /* Must be a list, since Flength did not get an error */ 2797 else
2792 { 2798 {
2793 Lisp_Object tail = seq; 2799 eassert (BOOL_VECTOR_P (seq));
2794 for (ptrdiff_t i = 0; i < leni; i++) 2800 for (EMACS_INT i = 0; i < leni; i++)
2795 { 2801 {
2796 if (! CONSP (tail)) 2802 Lisp_Object dummy = call1 (fn, bool_vector_ref (seq, i));
2797 return i;
2798 Lisp_Object dummy = call1 (fn, XCAR (tail));
2799 if (vals) 2803 if (vals)
2800 vals[i] = dummy; 2804 vals[i] = dummy;
2801 tail = XCDR (tail);
2802 } 2805 }
2803 } 2806 }
2804 2807