~ chicken-core (chicken-5) 87b879bac18b929255dfa46657fbb9d7b98854b8


commit 87b879bac18b929255dfa46657fbb9d7b98854b8
Author:     Peter Bex <peter@more-magic.net>
AuthorDate: Wed Dec 7 22:24:50 2016 +0100
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Mon Dec 12 12:08:33 2016 +1300

    Remove run-time/compile-time diffs in parameterize
    
    We bind the "saveds" once more to their own values.  This ensures that
    any call/cc in the parameterize form itself will not affect the
    saving/restoring of the parameters due to compilation strategy.
    
    Strictly speaking, I think this is not required by SRFI-39, but this way
    we get consistent behaviour in the tests, compiled or interpreted.
    
    Second part of fix for #1336
    
    Signed-off-by: Evan Hanson <evhan@foldling.org>

diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index 2ec358e3..51dd7afe 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -292,32 +292,37 @@
 	(##core#let
 	 ,(map ##sys#list saveds vals)
 	 (##core#let
-	  ((,convert? (,the ,boolean #t))) ; Convert only first time extent is entered!
-	  (##sys#dynamic-wind
-	   (##core#lambda ()
-	    (##core#let
-	     ;; First, call converters (which may throw exceptions!)
-	     ,(map (lambda (p s temp)
-		     `(,temp (##core#if ,convert? (,p ,s #t #f) ,s)))
-		   param-aliases saveds temps)
-	     ;; Save current values so we can restore them later
-	     ,@(map (lambda (p s) `(##core#set! ,s (,p)))
-		    param-aliases saveds)
-	     ;; Set parameters to their new values.  This can't fail.
-	     ,@(map (lambda (p t) `(,p ,t #f #t)) param-aliases temps)
-	     ;; Remember we already converted (only call converters once!)
-	     (##core#set! ,convert? #f) ) )
-	   (##core#lambda () ,@body)
-	   (##core#lambda ()
-	     (##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)))))))))))
+	  ;; Inner names are actually set.  This hides the exact
+	  ;; ordering of the let if any call/cc is used in the
+	  ;; value expressions (see first example in #1336).
+	  ,(map ##sys#list saveds saveds)
+	  (##core#let
+	   ((,convert? (,the ,boolean #t))) ; Convert only first time extent is entered!
+	   (##sys#dynamic-wind
+	    (##core#lambda ()
+	      (##core#let
+	       ;; First, call converters (which may throw exceptions!)
+	       ,(map (lambda (p s temp)
+		       `(,temp (##core#if ,convert? (,p ,s #t #f) ,s)))
+		     param-aliases saveds temps)
+	       ;; Save current values so we can restore them later
+	       ,@(map (lambda (p s) `(##core#set! ,s (,p)))
+		      param-aliases saveds)
+	       ;; Set parameters to their new values.  This can't fail.
+	       ,@(map (lambda (p t) `(,p ,t #f #t)) param-aliases temps)
+	       ;; Remember we already converted (only call converters once!)
+	       (##core#set! ,convert? #f)))
+	    (##core#lambda () ,@body)
+	    (##core#lambda ()
+	      (##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 '()
Trap