~ chicken-core (chicken-5) fdfdfc808704e53a8eebbd30d00fd79c6a2710a0
commit fdfdfc808704e53a8eebbd30d00fd79c6a2710a0
Author: Peter Bex <peter@more-magic.net>
AuthorDate: Mon May 16 13:01:35 2016 +0200
Commit: Peter Bex <peter@more-magic.net>
CommitDate: Sun May 22 13:22:19 2016 +0200
Make special-cased parameter setters compatible with new-style parameterize
If set? if #f it should not try to set the value. This would prevent
parameterize from restoring the original value.
Fixes #1285
Signed-off-by: Evan Hanson <evhan@foldling.org>
diff --git a/library.scm b/library.scm
index 292554e3..3a8a4ef8 100644
--- a/library.scm
+++ b/library.scm
@@ -2683,25 +2683,28 @@ EOF
(##core#inline "C_i_check_port_2" x 0 #t (car loc))
(##core#inline "C_i_check_port" x 0 #t) ) )
-(define (current-input-port . arg)
- (when (pair? arg)
- (let ([p (car arg)])
+(define (current-input-port . args)
+ (when (pair? args)
+ (let ((p (car args)))
(##sys#check-port p 'current-input-port)
- (set! ##sys#standard-input p) ))
+ (let-optionals (cdr args) ((convert? #t) (set? #t))
+ (when set? (set! ##sys#standard-input p))) ) )
##sys#standard-input)
-(define (current-output-port . arg)
- (when (pair? arg)
- (let ([p (car arg)])
+(define (current-output-port . args)
+ (when (pair? args)
+ (let ((p (car args)))
(##sys#check-port p 'current-output-port)
- (set! ##sys#standard-output p) ) )
+ (let-optionals (cdr args) ((convert? #t) (set? #t))
+ (when set? (set! ##sys#standard-output p))) ) )
##sys#standard-output)
-(define (current-error-port . arg)
- (when (pair? arg)
- (let ([p (car arg)])
+(define (current-error-port . args)
+ (when (pair? args)
+ (let ((p (car args)))
(##sys#check-port p 'current-error-port)
- (set! ##sys#standard-error p) ) )
+ (let-optionals (cdr args) ((convert? #t) (set? #t))
+ (when set? (set! ##sys#standard-error p))) ) )
##sys#standard-error)
(define (##sys#tty-port? port)
@@ -4769,9 +4772,13 @@ EOF
thunk
(lambda () (set! ##sys#current-exception-handler oldh)) ) ) )
-(define (current-exception-handler #!optional proc)
- (when proc
- (set! ##sys#current-exception-handler proc))
+(define (current-exception-handler . args)
+ (when (pair? args)
+ (let ((proc (car args)))
+ (##sys#check-closure proc 'current-exception-handler)
+ (let-optionals (cdr args) ((convert? #t) (set? #t))
+ (when set?
+ (set! ##sys#current-exception-handler proc))) ) )
##sys#current-exception-handler)
(define (make-property-condition kind . props)
diff --git a/tests/library-tests.scm b/tests/library-tests.scm
index 21b27fd6..1fd82f0b 100644
--- a/tests/library-tests.scm
+++ b/tests/library-tests.scm
@@ -541,6 +541,27 @@ A
(assert (equal? (list "1" "2") (list (a) (b)))) )
+;; Special-cased parameters are reset correctly (#1285, regression
+;; caused by fix for #1227)
+
+(let ((original-input (current-input-port))
+ (original-output (current-output-port))
+ (original-error (current-error-port))
+ (original-exception-handler (current-exception-handler)))
+ (call-with-output-string
+ (lambda (out)
+ (call-with-input-string
+ "foo"
+ (lambda (in)
+ (parameterize ((current-output-port out)
+ (current-error-port out)
+ (current-input-port in)
+ (current-exception-handler void))
+ (void))))))
+ (assert (equal? original-input (current-input-port)))
+ (assert (equal? original-output (current-output-port)))
+ (assert (equal? original-error (current-error-port)))
+ (assert (equal? original-exception-handler (current-exception-handler))))
;;; vector and blob limits
diff --git a/types.db b/types.db
index 227fd72e..61b4f058 100644
--- a/types.db
+++ b/types.db
@@ -731,14 +731,14 @@
(output-port? (#(procedure #:pure #:predicate output-port) output-port? (*) boolean))
(current-input-port
- (#(procedure #:clean #:enforce) current-input-port (#!optional input-port) input-port)
+ (#(procedure #:clean #:enforce) current-input-port (#!optional input-port boolean boolean) input-port)
((input-port) (let ((#(tmp1) #(1)))
(let ((#(tmp2) (set! ##sys#standard-input #(tmp1))))
#(tmp1))))
(() ##sys#standard-input))
(current-output-port
- (#(procedure #:clean #:enforce) current-output-port (#!optional output-port) output-port)
+ (#(procedure #:clean #:enforce) current-output-port (#!optional output-port boolean boolean) output-port)
((output-port) (let ((#(tmp1) #(1)))
(let ((#(tmp2) (set! ##sys#standard-output #(tmp1))))
#(tmp1))))
@@ -983,14 +983,14 @@
(char (or false (procedure (input-port) . *))) undefined))
(current-error-port
- (#(procedure #:clean #:enforce) current-error-port (#!optional output-port) output-port)
+ (#(procedure #:clean #:enforce) current-error-port (#!optional output-port boolean boolean) output-port)
((output-port) (let ((#(tmp1) #(1)))
(let ((#(tmp2) (set! ##sys#standard-error #(tmp1))))
#(tmp1))))
(() ##sys#standard-error))
(current-exception-handler
- (#(procedure #:clean #:enforce) current-exception-handler (#!optional (procedure (*) noreturn)) procedure)
+ (#(procedure #:clean #:enforce) current-exception-handler (#!optional (procedure (*) noreturn) boolean boolean) procedure)
((procedure) (let ((#(tmp1) #(1)))
(let ((#(tmp2) (set! ##sys#current-exception-handler #(tmp1))))
#(tmp1))))
Trap