~ chicken-core (chicken-5) 5ae71ecd963948d0d1c9eeea5c47c32ecaac963a
commit 5ae71ecd963948d0d1c9eeea5c47c32ecaac963a
Author: Jim Ursetto <zbigniewsz@gmail.com>
AuthorDate: Mon Dec 19 15:53:13 2011 -0600
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Tue Dec 20 07:21:38 2011 +0100
Ensure current-{input,output}-port are properly restored on exception.
Modify with-input-from-{file,pipe} and with-output-to-{file,pipe} to use
fluid-let on ##sys#standard-{input,output} to ensure they are restored
after an exception. The ports were restored only if the exception bubbled
up to the REPL; if intercepted prior to that, the REPL would then read
further commands from (or write output to) that file or pipe.
Signed-off-by: felix <felix@call-with-current-continuation.org>
diff --git a/library.scm b/library.scm
index 9b65ad29..aed45dc4 100644
--- a/library.scm
+++ b/library.scm
@@ -1996,27 +1996,23 @@ EOF
(let ((open-input-file open-input-file)
(close-input-port close-input-port) )
(lambda (str thunk . mode)
- (let ((old ##sys#standard-input)
- (file (apply open-input-file str mode)) )
- (set! ##sys#standard-input file)
- (##sys#call-with-values thunk
- (lambda results
- (close-input-port file)
- (set! ##sys#standard-input old)
- (apply ##sys#values results) ) ) ) ) ) )
+ (let ((file (apply open-input-file str mode)))
+ (fluid-let ((##sys#standard-input file))
+ (##sys#call-with-values thunk
+ (lambda results
+ (close-input-port file)
+ (apply ##sys#values results) ) ) ) ) ) ) )
(define with-output-to-file
(let ((open-output-file open-output-file)
(close-output-port close-output-port) )
(lambda (str thunk . mode)
- (let ((old ##sys#standard-output)
- (file (apply open-output-file str mode)) )
- (set! ##sys#standard-output file)
- (##sys#call-with-values thunk
- (lambda results
- (close-output-port file)
- (set! ##sys#standard-output old)
- (apply ##sys#values results) ) ) ) ) ) )
+ (let ((file (apply open-output-file str mode)))
+ (fluid-let ((##sys#standard-output file))
+ (##sys#call-with-values thunk
+ (lambda results
+ (close-output-port file)
+ (apply ##sys#values results) ) ) ) ) ) ) )
(define (##sys#file-exists? name file? dir? loc)
(case (##core#inline "C_i_file_exists_p" (##sys#make-c-string name loc) file? dir?)
diff --git a/posixunix.scm b/posixunix.scm
index f1af0926..9b238465 100644
--- a/posixunix.scm
+++ b/posixunix.scm
@@ -858,24 +858,20 @@ EOF
(define with-input-from-pipe
(lambda (cmd thunk . mode)
- (let ([old ##sys#standard-input]
- [p (apply open-input-pipe cmd mode)] )
- (set! ##sys#standard-input p)
- (##sys#call-with-values thunk
- (lambda results
- (close-input-pipe p)
- (set! ##sys#standard-input old)
- (apply values results) ) ) ) ) )
+ (let ([p (apply open-input-pipe cmd mode)])
+ (fluid-let ((##sys#standard-input p))
+ (##sys#call-with-values thunk
+ (lambda results
+ (close-input-pipe p)
+ (apply values results) ) ) ) ) ) )
(define with-output-to-pipe
(lambda (cmd thunk . mode)
- (let ([old ##sys#standard-output]
- [p (apply open-output-pipe cmd mode)] )
- (set! ##sys#standard-output p)
- (##sys#call-with-values thunk
- (lambda results
- (close-output-pipe p)
- (set! ##sys#standard-output old)
- (apply values results) ) ) ) ) )
+ (let ([p (apply open-output-pipe cmd mode)])
+ (fluid-let ((##sys#standard-output p))
+ (##sys#call-with-values thunk
+ (lambda results
+ (close-output-pipe p)
+ (apply values results) ) ) ) ) ) )
(define-foreign-variable _pipefd0 int "C_pipefds[ 0 ]")
(define-foreign-variable _pipefd1 int "C_pipefds[ 1 ]")
diff --git a/posixwin.scm b/posixwin.scm
index bc61b7e7..c12c2c54 100644
--- a/posixwin.scm
+++ b/posixwin.scm
@@ -1184,27 +1184,23 @@ EOF
(define with-input-from-pipe
(lambda (cmd thunk . mode)
- (let ([old ##sys#standard-input]
- [p (apply open-input-pipe cmd mode)] )
- (set! ##sys#standard-input p)
- (##sys#call-with-values
- thunk
- (lambda results
- (close-input-pipe p)
- (set! ##sys#standard-input old)
- (apply values results) ) ) ) ) )
+ (let ([p (apply open-input-pipe cmd mode)])
+ (fluid-let ((##sys#standard-input p))
+ (##sys#call-with-values
+ thunk
+ (lambda results
+ (close-input-pipe p)
+ (apply values results) ) ) ) ) ) )
(define with-output-to-pipe
(lambda (cmd thunk . mode)
- (let ([old ##sys#standard-output]
- [p (apply open-output-pipe cmd mode)] )
- (set! ##sys#standard-output p)
- (##sys#call-with-values
- thunk
- (lambda results
- (close-output-pipe p)
- (set! ##sys#standard-output old)
- (apply values results) ) ) ) ) )
+ (let ([p (apply open-output-pipe cmd mode)])
+ (fluid-let ((##sys#standard-output p))
+ (##sys#call-with-values
+ thunk
+ (lambda results
+ (close-output-pipe p)
+ (apply values results) ) ) ) ) ) )
;;; Pipe primitive:
Trap