]> git.eshelyaron.com Git - emacs.git/commitdiff
Use `take` where clearly safe to do so (bug#56521)
authorMattias Engdegård <mattiase@acm.org>
Sun, 17 Jul 2022 17:05:03 +0000 (19:05 +0200)
committerMattias Engdegård <mattiase@acm.org>
Mon, 18 Jul 2022 10:49:29 +0000 (12:49 +0200)
* lisp/emacs-lisp/seq.el (seq-take):
* lisp/auth-source.el (auth-source-secrets-search)
(auth-source-plstore-search):
* lisp/gnus/message.el (message-insert-formatted-citation-line):
* lisp/net/dbus.el (dbus-unregister-object):
* lisp/replace.el (occur-context-lines):
* test/src/print-tests.el (print-circular): Replace hand-written loop
or `butlast` call with `take` for clarity, performance and validation.
We have the equivalence
(take N LIST) = (butlast LIST (- (length LIST) N)).

lisp/auth-source.el
lisp/emacs-lisp/seq.el
lisp/gnus/message.el
lisp/net/dbus.el
lisp/replace.el
test/src/print-tests.el

index 12da2c3d73dfb24bbed6ffa929345b0df730ce1b..a802ef856dc29a9f3eb8637cce16b8bfb04f10ad 100644 (file)
@@ -1622,7 +1622,7 @@ authentication tokens:
                                 (not (string-match label item)))
                     collect item)))
          ;; TODO: respect max in `secrets-search-items', not after the fact
-         (items (butlast items (- (length items) max)))
+         (items (take max items))
          ;; convert the item name to a full plist
          (items (mapcar (lambda (item)
                           (append
@@ -2080,7 +2080,7 @@ entries for git.gnus.org:
                                      search-keys)))
          (items (plstore-find store search-spec))
          (item-names (mapcar #'car items))
-         (items (butlast items (- (length items) max)))
+         (items (take max items))
          ;; convert the item to a full plist
          (items (mapcar (lambda (item)
                           (let* ((plist (copy-tree (cdr item)))
index 36c17f4cd5eae192da0a9d4638a7a2cabea74664..0d9483aecb6fffc1d7e62e304c4d50f51ba8617e 100644 (file)
@@ -587,11 +587,13 @@ Signal an error if SEQUENCE is empty."
 
 (cl-defmethod seq-take ((list list) n)
   "Optimized implementation of `seq-take' for lists."
-  (let ((result '()))
-    (while (and list (> n 0))
-      (setq n (1- n))
-      (push (pop list) result))
-    (nreverse result)))
+  (if (eval-when-compile (fboundp 'take))
+      (take n list)
+    (let ((result '()))
+      (while (and list (> n 0))
+        (setq n (1- n))
+        (push (pop list) result))
+      (nreverse result))))
 
 (cl-defmethod seq-drop-while (pred (list list))
   "Optimized implementation of `seq-drop-while' for lists."
index 7c2b24c6eee763cc9b0df7db58101aee06927dfe..00a27fb5f51468025fc4c4b09c0dd2f42bfc2a00 100644 (file)
@@ -4180,8 +4180,7 @@ See `message-citation-line-format'."
                  (setq fname (car names)
                        lname (string-join (cdr names) " ")))
                 ((> count 3)
-                 (setq fname (string-join (butlast names (- count 2))
-                                          " ")
+                 (setq fname (string-join (take 2 names) " ")
                        lname (string-join (nthcdr 2 names) " "))))
           (when (string-match "\\(.*\\),\\'" fname)
             (let ((newlname (match-string 1 fname)))
index d4d4ed54e909f091b70ab6e4c648df4ca1c0f4b4..6c978c5a5fed8ea831ccbab23fdce8e6b3db0854 100644 (file)
@@ -941,9 +941,7 @@ association to the service from D-Bus."
 
     ;; Loop over the registered functions.
     (dolist (elt entry)
-      (when (equal
-            value
-            (butlast (cdr elt) (- (length (cdr elt)) (length value))))
+      (when (equal value (take (length value) (cdr elt)))
        (setq ret t)
        ;; Compute new hash value.  If it is empty, remove it from the
        ;; hash table.
index 54ee64f64a51b63c1c84eb0f09af9662e7e32491..f8cc784f7c6fa239eee81e1693902020ba1ec752 100644 (file)
@@ -2437,9 +2437,8 @@ See also `multi-occur'."
       (if (>= (+ prev-line (length prev-after-lines))
              (- curr-line (length before-lines)))
          (setq prev-after-lines
-               (butlast prev-after-lines
-                        (- (length prev-after-lines)
-                           (- curr-line prev-line (length before-lines) 1))))
+                (take (- curr-line prev-line (length before-lines) 1)
+                      prev-after-lines))
        ;; Separate non-overlapping context lines with a dashed line.
        (setq separator "-------\n")))
 
index 6ff7e997837efcae4b3bf2ce2b946d29bfa78669..f818b4d4715f413c0897fca1d8f99121479daf83 100644 (file)
@@ -514,7 +514,7 @@ otherwise, use a different charset."
               (should (< lead (length numbers)))
               (should (<= lead loopback-index))
               (should (< loopback-index (length numbers)))
-              (let ((lead-part (butlast numbers (- (length numbers) lead)))
+              (let ((lead-part (take lead numbers))
                     (loop-part (nthcdr lead numbers)))
                 ;; The lead part must match exactly.
                 (should (equal lead-part (number-sequence 1 lead)))