From 7b27ca02948960c6deed655cc6106a939dcfa45b Mon Sep 17 00:00:00 2001 From: Peter Bex Date: Wed, 7 Dec 2016 22:24:50 +0100 Subject: [PATCH 2/2] 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 --- chicken-syntax.scm | 59 +++++++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/chicken-syntax.scm b/chicken-syntax.scm index 1eb066d..25e3219 100644 --- a/chicken-syntax.scm +++ b/chicken-syntax.scm @@ -290,34 +290,39 @@ `(##core#let ,(map ##sys#list param-aliases params) ; These may be expressions (##core#let - ,(map ##sys#list saveds vals) + ,(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 '() -- 2.1.4