Here's a simple reproducer: (use-modules (ice-9 binary-ports) (ice-9 suspendable-ports) (rnrs bytevectors))
(define (test) (let* ((sequence '(#xf4 #xa4 #xbd #xa4)) (p (open-bytevector-input-port (u8-list->bytevector sequence)))) (set-port-encoding! p "UTF-8") (set-port-conversion-strategy! p 'substitute) (peek (read-char p)))) (test) (install-suspendable-ports!) (test) If you run it, it outputs #\� as expected the first time, but then using suspendable ports, it raises an exception. The behaviour should be the same. ;;; (#\�) Backtrace: In ice-9/boot-9.scm: 1752:10 8 (with-exception-handler _ _ #:unwind? _ # _) In unknown file: 7 (apply-smob/0 #<thunk 7f3f09cbe300>) In ice-9/boot-9.scm: 724:2 6 (call-with-prompt ("prompt") #<procedure 7f3f09ccb320 …> …) In ice-9/eval.scm: 619:8 5 (_ #(#(#<directory (guile-user) 7f3f09cc1c80>))) In ice-9/boot-9.scm: 2836:4 4 (save-module-excursion #<procedure 7f3f09cb2300 at ice-…>) 4388:12 3 (_) In /home/chris/Projects/Guile/guile/bad-unicode.scm: 12:10 2 (test) In ice-9/suspendable-ports.scm: 591:33 1 (read-char _) 499:12 0 (peek-char-and-next-cur/utf8 _ _ _ _) ice-9/suspendable-ports.scm:499:12: In procedure peek-char-and-next-cur/utf8: In procedure integer->char: Argument 1 out of range: 1199972