~ chicken-core (chicken-5) 9e20052a88adb540aef72058463921a43ac6b088


commit 9e20052a88adb540aef72058463921a43ac6b088
Author:     Peter Bex <peter@more-magic.net>
AuthorDate: Tue Dec 6 22:12:59 2016 +0100
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Mon Dec 12 12:08:12 2016 +1300

    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.
    
    Signed-off-by: Evan Hanson <evhan@foldling.org>

diff --git a/NEWS b/NEWS
index d3c9b403..052cf13c 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 ec9aff31..2ec358e3 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 384ca402..cd2f6e96 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))
Trap