~ chicken-core (chicken-5) a75d2b22bdbb990cf336c696f297de22a1247e0b
commit a75d2b22bdbb990cf336c696f297de22a1247e0b
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 11:26:16 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 8b164145..6976e9d4 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -304,32 +304,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