~ 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