From d0e6dc755604526646dd6ba3b53021bf1ffff54c Mon Sep 17 00:00:00 2001 From: Vasilij Schneidermann Date: Sun, 17 Mar 2024 19:47:30 +0100 Subject: [PATCH 1/4] Avoid needless allocation in read-bytevector! This change switches the implementation strategy to basing read-bytevector on top of read-bytevector! rather than the other way around. --- lib/scheme/extras.scm | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/lib/scheme/extras.scm b/lib/scheme/extras.scm index 98b4f3c3..b87ce396 100644 --- a/lib/scheme/extras.scm +++ b/lib/scheme/extras.scm @@ -136,15 +136,8 @@ #u8() (let ((in (if (pair? o) (car o) (current-input-port))) (res (make-bytevector n))) - (let lp ((i 0)) - (if (>= i n) - res - (let ((x (read-u8 in))) - (cond ((eof-object? x) - (if (zero? i) x (subbytes res 0 i))) - (else - (bytevector-u8-set! res i x) - (lp (+ i 1)))))))))) + (read-bytevector! res in) + res))) (define (read-bytevector! vec . o) (let* ((in (if (pair? o) (car o) (current-input-port))) @@ -152,19 +145,19 @@ (start (if (pair? o) (car o) 0)) (end (if (and (pair? o) (pair? (cdr o))) (cadr o) - (bytevector-length vec)))) + (bytevector-length vec))) + (n (- end start))) (if (>= start end) 0 - (let ((res (read-bytevector (- end start) in))) - (cond - ((eof-object? res) - res) - (else - (let ((len (bytevector-length res))) - (do ((i 0 (+ i 1))) - ((>= i len) len) - (bytevector-u8-set! vec (+ i start) (bytevector-u8-ref res i)) - )))))))) + (let lp ((i 0)) + (if (>= i n) + i + (let ((x (read-u8 in))) + (cond ((eof-object? x) + (if (zero? i) x i)) + (else + (bytevector-u8-set! vec (+ i start) x) + (lp (+ i 1)))))))))) (define (write-bytevector vec . o) (let* ((out (if (pair? o) (car o) (current-output-port))) From 1b1e8b311b87bbe7aadb0f7ab4f5f590a5558ba0 Mon Sep 17 00:00:00 2001 From: Vasilij Schneidermann Date: Mon, 18 Mar 2024 02:06:27 +0100 Subject: [PATCH 2/4] Correct read-bytevector logic for small reads --- lib/scheme/extras.scm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/scheme/extras.scm b/lib/scheme/extras.scm index b87ce396..9796a0e1 100644 --- a/lib/scheme/extras.scm +++ b/lib/scheme/extras.scm @@ -135,9 +135,11 @@ (if (zero? n) #u8() (let ((in (if (pair? o) (car o) (current-input-port))) - (res (make-bytevector n))) - (read-bytevector! res in) - res))) + (vec (make-bytevector n)) + (res (read-bytevector! vec in))) + (cond ((eof-object? res) res) + ((< res n) (subbytes vec 0 i)) + (else res))))) (define (read-bytevector! vec . o) (let* ((in (if (pair? o) (car o) (current-input-port))) From c837c7110f670bc40a01dd0d31fe8de565bf1800 Mon Sep 17 00:00:00 2001 From: Vasilij Schneidermann Date: Mon, 18 Mar 2024 02:48:48 +0100 Subject: [PATCH 3/4] Correct let to let* --- lib/scheme/extras.scm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/scheme/extras.scm b/lib/scheme/extras.scm index 9796a0e1..a9279464 100644 --- a/lib/scheme/extras.scm +++ b/lib/scheme/extras.scm @@ -134,9 +134,9 @@ (define (read-bytevector n . o) (if (zero? n) #u8() - (let ((in (if (pair? o) (car o) (current-input-port))) - (vec (make-bytevector n)) - (res (read-bytevector! vec in))) + (let* ((in (if (pair? o) (car o) (current-input-port))) + (vec (make-bytevector n)) + (res (read-bytevector! vec in))) (cond ((eof-object? res) res) ((< res n) (subbytes vec 0 i)) (else res))))) From 0fd351e0b587ea80070f4affa4624d006b730c1c Mon Sep 17 00:00:00 2001 From: Vasilij Schneidermann Date: Mon, 18 Mar 2024 03:15:39 +0100 Subject: [PATCH 4/4] Fix read-bytevector logic --- lib/scheme/extras.scm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/scheme/extras.scm b/lib/scheme/extras.scm index a9279464..304db168 100644 --- a/lib/scheme/extras.scm +++ b/lib/scheme/extras.scm @@ -138,8 +138,8 @@ (vec (make-bytevector n)) (res (read-bytevector! vec in))) (cond ((eof-object? res) res) - ((< res n) (subbytes vec 0 i)) - (else res))))) + ((< res n) (subbytes vec 0 res)) + (else vec))))) (define (read-bytevector! vec . o) (let* ((in (if (pair? o) (car o) (current-input-port)))