]> git.eshelyaron.com Git - emacs.git/commitdiff
Minor `concat` tweaks
authorMattias Engdegård <mattiase@acm.org>
Wed, 26 Jan 2022 10:28:33 +0000 (11:28 +0100)
committerMattias Engdegård <mattiase@acm.org>
Wed, 26 Jan 2022 16:10:16 +0000 (17:10 +0100)
* src/fns.c (concat): Do things in the right order for speed.
(concat_strings): Initialise variable.

src/fns.c

index 87237f3b5e46057ac5b9418fd1a005c3462cb4b2..16f1ebe4392d848b1e07880e673c563ab2dc481c 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -790,9 +790,8 @@ concat_strings (ptrdiff_t nargs, Lisp_Object *args)
 
       if (STRINGP (arg))
        {
-         ptrdiff_t arg_len_byte;
+         ptrdiff_t arg_len_byte = SBYTES (arg);
          len = SCHARS (arg);
-         arg_len_byte = SBYTES (arg);
          if (STRING_MULTIBYTE (arg))
            dest_multibyte = true;
          else
@@ -986,15 +985,16 @@ concat (ptrdiff_t nargs, Lisp_Object *args, Lisp_Object last_tail,
        memory_full (SIZE_MAX);
     }
 
+  /* When the target is a list, return the tail directly if all other
+     arguments are empty.  */
+  if (!vector_target && result_len == 0)
+    return last_tail;
+
   /* Create the output object.  */
   Lisp_Object result = vector_target
     ? make_nil_vector (result_len)
     : Fmake_list (make_fixnum (result_len), Qnil);
 
-  /* In `append', if all but last arg are nil, return last arg.  */
-  if (!vector_target && NILP (result))
-    return last_tail;
-
   /* Copy the contents of the args into the result.  */
   Lisp_Object tail = Qnil;
   ptrdiff_t toindex = 0;
@@ -1022,14 +1022,12 @@ concat (ptrdiff_t nargs, Lisp_Object *args, Lisp_Object last_tail,
          /* Fetch next element of `arg' arg into `elt', or break if
             `arg' is exhausted. */
          Lisp_Object elt;
-         if (NILP (arg))
-           break;
          if (CONSP (arg))
            {
              elt = XCAR (arg);
              arg = XCDR (arg);
            }
-         else if (argindex >= arglen)
+         else if (NILP (arg) || argindex >= arglen)
            break;
          else if (STRINGP (arg))
            {