racket/port: possible repair for `read-bytes-evt'
Also restore and add some tests.
Merge to v5.3
(cherry picked from commit 70ef4e6e57
)
Conflicts:
collects/racket/port.rkt
This commit is contained in:
parent
662ffe7b02
commit
76306744ba
|
@ -962,6 +962,7 @@
|
||||||
;; go is the main reading function, either called directly for
|
;; go is the main reading function, either called directly for
|
||||||
;; a poll, or called in a thread for a non-poll read
|
;; a poll, or called in a thread for a non-poll read
|
||||||
(define (go nack ch poll?)
|
(define (go nack ch poll?)
|
||||||
|
;; FIXME - what if the input port is closed?
|
||||||
(let try-again ([pos 0] [bstr orig-bstr] [progress-evt #f])
|
(let try-again ([pos 0] [bstr orig-bstr] [progress-evt #f])
|
||||||
(let* ([progress-evt
|
(let* ([progress-evt
|
||||||
;; if no progress event is given, get one to ensure that
|
;; if no progress event is given, get one to ensure that
|
||||||
|
@ -1004,10 +1005,11 @@
|
||||||
(channel-put-evt ch result))
|
(channel-put-evt ch result))
|
||||||
input-port)
|
input-port)
|
||||||
result]
|
result]
|
||||||
[(and (eof-object? eof)
|
|
||||||
|
[(and (eof-object? v)
|
||||||
(zero? pos)
|
(zero? pos)
|
||||||
(not (sync/timeout 0 progress-evt)))
|
(not (sync/timeout 0 progress-evt)))
|
||||||
;; Must be a true end-of-file
|
;; Must be a true end-of-file, since commit failed
|
||||||
(let ([result (combo bstr eof)])
|
(let ([result (combo bstr eof)])
|
||||||
(if poll? result (channel-put ch result)))]
|
(if poll? result (channel-put ch result)))]
|
||||||
[poll? #f]
|
[poll? #f]
|
||||||
|
|
|
@ -286,7 +286,7 @@
|
||||||
(go-stream #t #t #t #t)))
|
(go-stream #t #t #t #t)))
|
||||||
|
|
||||||
;; make-input-port/read-to-peek
|
;; make-input-port/read-to-peek
|
||||||
(define (make-list-port . l)
|
(define (make-list-port #:eof-as-special? [eof-as-special? #f] . l)
|
||||||
(make-input-port/read-to-peek
|
(make-input-port/read-to-peek
|
||||||
'list-port
|
'list-port
|
||||||
(lambda (bytes)
|
(lambda (bytes)
|
||||||
|
@ -301,6 +301,10 @@
|
||||||
(bytes-set! bytes 0 (char->integer (car l)))
|
(bytes-set! bytes 0 (char->integer (car l)))
|
||||||
(set! l (cdr l))
|
(set! l (cdr l))
|
||||||
1]
|
1]
|
||||||
|
[(and (not eof-as-special?)
|
||||||
|
(eof-object? (car l)))
|
||||||
|
(set! l (cdr l))
|
||||||
|
eof]
|
||||||
[else
|
[else
|
||||||
(let ([v (car l)])
|
(let ([v (car l)])
|
||||||
(set! l (cdr l))
|
(set! l (cdr l))
|
||||||
|
@ -345,11 +349,23 @@
|
||||||
(test 'lo read p)
|
(test 'lo read p)
|
||||||
(test eof read p)
|
(test eof read p)
|
||||||
(test eof read p))
|
(test eof read p))
|
||||||
|
(let ([p (make-list-port #:eof-as-special? #t #\h #\e #\l eof #\l #\o)])
|
||||||
|
(test 'hel read p)
|
||||||
|
(test eof read p)
|
||||||
|
(test 'lo read p)
|
||||||
|
(test eof read p)
|
||||||
|
(test eof read p))
|
||||||
(let ([p (make-list-port #\h #\e #\l #\u7238 #\l #\o)])
|
(let ([p (make-list-port #\h #\e #\l #\u7238 #\l #\o)])
|
||||||
(test 'hel read p)
|
(test 'hel read p)
|
||||||
(test #\u7238 read p)
|
(test #\u7238 read p)
|
||||||
(test 'lo read p))
|
(test 'lo read p))
|
||||||
|
|
||||||
|
(let ([p (make-list-port 65 eof 66 67)])
|
||||||
|
(test 65 peek-byte p 0)
|
||||||
|
(test eof peek-byte p 1)
|
||||||
|
(test #t port-commit-peeked 2 (port-progress-evt p) always-evt p)
|
||||||
|
(test 66 peek-byte p 0))
|
||||||
|
|
||||||
;; Check that make-input-port/read-to-peek isn't trying
|
;; Check that make-input-port/read-to-peek isn't trying
|
||||||
;; to use chars when it should use bytes:
|
;; to use chars when it should use bytes:
|
||||||
(let-values ([(pipe-r pipe-w) (make-pipe)])
|
(let-values ([(pipe-r pipe-w) (make-pipe)])
|
||||||
|
@ -964,13 +980,13 @@
|
||||||
(define-values (i o) (tcp-connect "localhost" PORT))
|
(define-values (i o) (tcp-connect "localhost" PORT))
|
||||||
(write-bytes s o)
|
(write-bytes s o)
|
||||||
(close-output-port o)
|
(close-output-port o)
|
||||||
(test s read-bytes M i)))
|
(test s read-bytes M i)
|
||||||
|
(close-input-port i)))
|
||||||
|
|
||||||
(sync server)
|
(sync server)
|
||||||
(tcp-close listener))
|
(tcp-close listener))
|
||||||
|
|
||||||
(let ([integer->byte (lambda (s) (bitwise-and s #xFF))])
|
(let ([integer->byte (lambda (s) (bitwise-and s #xFF))])
|
||||||
#;
|
|
||||||
(check-can-reuse read-bytes-evt read-bytes write-bytes integer->byte list->bytes bytes?)
|
(check-can-reuse read-bytes-evt read-bytes write-bytes integer->byte list->bytes bytes?)
|
||||||
;; the following should work because we use the same evt only after
|
;; the following should work because we use the same evt only after
|
||||||
;; success or to start at the same point in the input stream:
|
;; success or to start at the same point in the input stream:
|
||||||
|
@ -979,7 +995,6 @@
|
||||||
(wrap-evt (read-bytes!-evt bstr in)
|
(wrap-evt (read-bytes!-evt bstr in)
|
||||||
(lambda (v) (if (eof-object? v) v bstr))))
|
(lambda (v) (if (eof-object? v) v bstr))))
|
||||||
read-bytes write-bytes integer->byte list->bytes bytes?))
|
read-bytes write-bytes integer->byte list->bytes bytes?))
|
||||||
#;
|
|
||||||
(check-can-reuse read-string-evt read-string write-string integer->char list->string string?))
|
(check-can-reuse read-string-evt read-string write-string integer->char list->string string?))
|
||||||
|
|
||||||
;; --------------------------------------------------
|
;; --------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue
Block a user