master: Don't create an extra cons in (concatenate 'list ...)
stassats via Sbcl-commits <[email protected]>
| Newsgroups | gmane.lisp.steel-bank.cvs |
|---|---|
| Message-ID | <[email protected]> |
The branch "master" has been updated in SBCL:
via d3bd86dd8a65dc78e4900c539f0017ea02ad173e (commit)
from 2ef06b7346040225d5c9935cefee2f3c1ed8fc52 (commit)
- Log -----------------------------------------------------------------
commit d3bd86dd8a65dc78e4900c539f0017ea02ad173e
Author: Stas Boukarev <[email protected]>
Date: Tue Apr 7 04:07:37 2026 +0300
Don't create an extra cons in (concatenate 'list ...)
---
src/code/seq.lisp | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/src/code/seq.lisp b/src/code/seq.lisp
index e4ab7e9ad..57b3a2078 100644
--- a/src/code/seq.lisp
+++ b/src/code/seq.lisp
@@ -1407,11 +1407,15 @@ many elements are copied."
(defun %concatenate-to-list (&rest sequences)
(declare (explicit-check))
- (let* ((result (list nil))
+ (let* ((result (unaligned-dx-cons nil))
(splice result))
+ (declare (dynamic-extent result)
+ (sb-c::no-debug result splice))
(do-rest-arg ((sequence) sequences)
(sb-sequence:dosequence (e sequence)
- (setf splice (cdr (rplacd splice (list e))))))
+ (let ((cons (list e)))
+ (setf (cdr splice) cons
+ splice cons))))
(cdr result)))
(defun %concatenate-to-vector (widetag &rest sequences)
@@ -1434,15 +1438,19 @@ many elements are copied."
(defun %concatenate-to-list-subseq (&rest sequences)
(declare (explicit-check))
- (let* ((result (list nil))
+ (let* ((result (unaligned-dx-cons nil))
(splice result))
+ (declare (dynamic-extent result)
+ (sb-c::no-debug result splice))
(do-rest-arg ((arg index*) sequences)
(symbol-macrolet ((index (truly-the index index*)))
(cond ((eq arg '%splice)
(let ((n (truly-the index (fast-&rest-nth (incf index) sequences))))
(loop repeat n
do
- (setf splice (cdr (rplacd splice (list (fast-&rest-nth (incf index) sequences))))))))
+ (let ((cons (list (fast-&rest-nth (incf index) sequences))))
+ (setf (cdr splice) cons
+ splice cons)))))
((eq arg '%repeat)
(let* ((n (fast-&rest-nth (incf index) sequences))
(n (the index
@@ -1454,7 +1462,9 @@ many elements are copied."
(element (fast-&rest-nth (incf index) sequences)))
(loop repeat n
do
- (setf splice (cdr (rplacd splice (list element)))))))
+ (let ((cons (list element)))
+ (setf (cdr splice) cons
+ splice cons)))))
(t
(multiple-value-bind (seq start2 end2)
(cond ((eq arg '%subseq)
@@ -1465,7 +1475,9 @@ many elements are copied."
(t
(values arg 0 nil)))
(do-subsequence (e seq start2 end2)
- (setf splice (cdr (rplacd splice (list e))))))))))
+ (let ((cons (list e)))
+ (setf (cdr splice) cons
+ splice cons))))))))
(cdr result)))
(defun %concatenate-to-vector-subseq (widetag &rest sequences)
-----------------------------------------------------------------------
hooks/post-receive
--
SBCL