From 490c445e40691df7a7eb47e5da6ddef7235c440f Mon Sep 17 00:00:00 2001 From: Peter Bex Date: Tue, 6 Dec 2016 22:12:59 +0100 Subject: [PATCH 1/2] Save "current" values when leaving parameterizes. These remembered parameter values are reinstated when we enter the dynamic extent again, instead of resetting to the original values the parameters had when first entering the extent, like we did in the fix for #1227. --- NEWS | 4 ++++ chicken-syntax.scm | 12 +++++++++--- tests/library-tests.scm | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index d3c9b40..052cf13 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,10 @@ - Core libraries: - Keywords are more consistently read/written, like symbols (#1332). + - SRFI-39: When jumping out of a parameterized dynamic extent, + "parameterize" now remember the actual values, so when jumping back + in, they are restored (fixes #1336, thanks to Joo ChurlSoo). + This was a regression caused by the fix for #1227. 4.11.1 diff --git a/chicken-syntax.scm b/chicken-syntax.scm index ec9aff3..1eb066d 100644 --- a/chicken-syntax.scm +++ b/chicken-syntax.scm @@ -309,9 +309,15 @@ (##core#set! ,convert? #f) ) ) (##core#lambda () ,@body) (##core#lambda () - ;; Restore parameters to their original, saved values - ,@(map (lambda (p s) `(,p ,s #f #t)) - param-aliases saveds) )) ) ) ) ) ))) + (##core#let + ;; Remember the current value of each parameter. + ,(map (lambda (p s temp) `(,temp (,p))) + param-aliases saveds temps) + ;; Restore each parameter to its old value. + ,@(map (lambda (p s) `(,p ,s #f #t)) param-aliases saveds) + ;; Save current value for later re-invocations. + ,@(map (lambda (s temp) `(##core#set! ,s ,temp)) + saveds temps))) )) ) ) ) ))) (##sys#extend-macro-environment 'when '() diff --git a/tests/library-tests.scm b/tests/library-tests.scm index 384ca40..cd2f6e9 100644 --- a/tests/library-tests.scm +++ b/tests/library-tests.scm @@ -587,6 +587,41 @@ A (assert (equal? original-error (current-error-port))) (assert (equal? original-exception-handler (current-exception-handler)))) +;; Re-entering dynamic extent of a parameterize should not reset to +;; original outer values but remember values when jumping out (another +;; regression due to #1227, pointed out by Joo ChurlSoo in #1336). + +(let ((f (make-parameter 'a)) + (path '()) + (g (make-parameter 'g)) + (c #f)) + (let ((add (lambda () (set! path (cons (f) path))))) + (add) + (parameterize ((f 'b) + (g (call-with-current-continuation + (lambda (c0) (set! c c0) 'c)))) + (add) (f (g)) (add)) + (f 'd) + (add) + (if (< (length path) 8) + (c 'e) + (assert (equal? '(a b c d b e d b e d) (reverse path)))))) + +(let ((f (make-parameter 'a)) + (path '()) + (g (make-parameter 'g)) + (c #f)) + (let ((add (lambda () (set! path (cons (f) path))))) + (add) + (parameterize ((f 'b)) + (g (call-with-current-continuation (lambda (c0) (set! c c0) 'c))) + (add) (f (g)) (add)) + (f 'd) + (add) + (if (< (length path) 8) + (c 'e) + (assert (equal? '(a b c d c e d e e d) (reverse path)))))) + ;;; vector and blob limits (assert-fail (make-blob -1)) -- 2.1.4