~ chicken-core (master) 6deadf39387b54591ed520fddd7759db570d67c6


commit 6deadf39387b54591ed520fddd7759db570d67c6
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Mar 21 15:58:14 2026 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sat Mar 21 15:58:14 2026 +0100

    fix vector->string
    
    Original patch contributed by Daniel Ziltener, with some corrections.

diff --git a/library.scm b/library.scm
index 06a5f9b7..3f06ab74 100644
--- a/library.scm
+++ b/library.scm
@@ -7815,24 +7815,24 @@ static C_word C_curdir(C_word buf, C_word size) {
         (s->v s (or start 0) (string-length s))))))
 
 (set! scheme#vector->string
- (lambda (v #!optional start end)
-  (let ((v->s (lambda (v start end)
-                (##sys#check-vector v 'vector->string)
-                (let* ((len (##sys#size v)))
-                  (##sys#check-range/including start 0 end 'vector->string)
-                  (##sys#check-range/including end start len 'vector->string)
-                  (let ((s (##sys#make-bytevector (fx* 4 (fx- end start)))))
-                    (let loop ((ti 0)
-                               (fi start))
-                      (if (fx= fi end)
-                          (##sys#buffer->string s 0 ti)
-                          (let ((c (##sys#slot v fi)))
-                            (##sys#check-char c 'vector->string)
-                            (loop (fx+ ti (##core#inline "C_utf_insert" s ti c))
-                                  (fx+ fi 1))))))))))
-    (if end
-        (v->s v start end)
-        (v->s v (or start 0) (##sys#size v))))))
+  (lambda (v #!optional start end)
+    (##sys#check-vector v 'vector->string)
+    (let ((v->s (lambda (v start end)
+                  (let ((len (##sys#size v)))
+                    (##sys#check-range/including start 0 end 'vector->string)
+                    (##sys#check-range/including end start len 'vector->string)
+                    (let ((bv (##sys#make-bytevector (fx* (fx- end start) 4))))
+                      (let loop ((i 0)
+                                 (p start))
+                        (if (fx= p end)
+                            (##sys#buffer->string bv 0 i)
+                            (let ((c (##sys#slot v p)))
+                              (##sys#check-char c 'vector->string)
+                              (loop (##core#inline "C_utf_insert" bv i c)
+                                    (fx+ p 1))))))))))
+      (if end
+          (v->s v start end)
+          (v->s v (or start 0) (##sys#size v))))))
 
 (set! scheme#string-map
   (lambda (proc str . more)
Trap