master: Transform (replace simple-vector list) with :start1/:end1

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  8d178ceef1a1325d07c07ba569954458c93b3f8f (commit)
      from  271dd00e2daf8199e31cd9622d3a42553743b7ea (commit)

- Log -----------------------------------------------------------------
commit 8d178ceef1a1325d07c07ba569954458c93b3f8f
Author: Stas Boukarev <[email protected]>
Date:   Mon Apr 6 22:25:17 2026 +0300

    Transform (replace simple-vector list) with :start1/:end1
---
 src/compiler/seqtran.lisp | 65 +++++++++++++++++++++++++++--------------------
 1 file changed, 38 insertions(+), 27 deletions(-)

diff --git a/src/compiler/seqtran.lisp b/src/compiler/seqtran.lisp
index a6deef7ce..78c30eea8 100644
--- a/src/compiler/seqtran.lisp
+++ b/src/compiler/seqtran.lisp
@@ -1598,36 +1598,47 @@
                (transform-replace t node)))
          (give-up-ir1-transform)))))
 
-(deftransform replace ((seq1 seq2)
-                       ((or null (simple-array * (*))) list) *
+(deftransform replace ((seq1 seq2 &key (start1 0) end1)
+                       ((or null (simple-array * (*))) list &key (:start1 t) (:end1 t)) *
                        :node node)
   (upgraded-element-type-specifier-or-give-up seq1)
-  (cond ((and (lvar-matches seq2 :fun-names '(reverse sb-impl::list-reverse))
-              ;; Nothing should be modifying the original sequence
-              (almost-immediately-used-p seq2 (lvar-use seq2)
-                                         :flushable t)
-              (splice-fun-args seq2 :any 1 nil))
+  `(let* ((len1 (length seq1))
+          (start1 ,(if start1
+                       'start1
+                       0))
+          (end1 (or end1 len1)))
+     ,@(when (and (or start1 end1)
+                  (policy node (> insert-array-bounds-checks 0)))
+         `((unless (<= 0 start1 end1 len1)
+             (sequence-bounding-indices-bad-error seq1 start1 end1))))
+     ,(cond ((and (lvar-matches seq2 :fun-names '(reverse sb-impl::list-reverse))
+                  ;; Nothing should be modifying the original sequence
+                  (almost-immediately-used-p seq2 (lvar-use seq2)
+                                             :flushable t)
+                  (splice-fun-args seq2 :any 1 nil))
+             `(when seq1
+                (let* ((list-length (length seq2))
 
-         `(when seq1
-            (let* ((list-length (length seq2))
-                   (vector-length (length seq1))
-                   (diff (- list-length vector-length)))
-              (when (> diff 0)
-                (setf seq2 (nthcdr diff seq2)))
-              (loop for i from (+ vector-length (if (< diff 0)
-                                                    (1- diff)
-                                                    -1))
-                    downto 0
-                    for elt in seq2
-                    do (setf (aref seq1 i) elt))
-              seq1)))
-        (t
-         `(when seq1
-            (loop for i below (length seq1)
-                  while seq2
-                  do (setf (aref seq1 i)
-                           (pop seq2)))
-            seq1))))
+                       (diff (- list-length
+                                (- end1 start1))))
+                  (when (> diff 0)
+                    (setf seq2 (nthcdr diff seq2)))
+                  (loop for i from (+ end1 (if (< diff 0)
+                                               (1- diff)
+                                               -1))
+                        downto ,(if start1
+                                    'start1
+                                    0)
+                        for elt in seq2
+                        do (setf (aref seq1 i) elt))
+                  seq1)))
+            (t
+             `(when seq1
+                (loop for i from start1 below end1
+                      while seq2
+                      do (setf (aref seq1 i)
+                               (pop seq2)))
+                seq1)))))
 
 #+sb-unicode
 (progn

-----------------------------------------------------------------------


hooks/post-receive
-- 
SBCL
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.