From 0d19c7ac952b3c70fdc47b1b829f4c668b2ebf4a Mon Sep 17 00:00:00 2001
From: Peter Bex <peter@more-magic.net>
Date: Tue, 6 Dec 2016 22:12:59 +0100
Subject: [PATCH] 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.
---
NEWS | 4 ++++
chicken-syntax.scm | 11 ++++++++---
tests/library-tests.scm | 35 +++++++++++++++++++++++++++++++++++
3 files changed, 47 insertions(+), 3 deletions(-)
diff --git a/NEWS b/NEWS
index d3c9b40..052cf13 100644
a
|
b
|
|
9 | 9 | |
10 | 10 | - Core libraries: |
11 | 11 | - Keywords are more consistently read/written, like symbols (#1332). |
| 12 | - SRFI-39: When jumping out of a parameterized dynamic extent, |
| 13 | "parameterize" now remember the actual values, so when jumping back |
| 14 | in, they are restored (fixes #1336, thanks to Joo ChurlSoo). |
| 15 | This was a regression caused by the fix for #1227. |
12 | 16 | |
13 | 17 | 4.11.1 |
14 | 18 | |
diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index ec9aff3..364dad2 100644
a
|
b
|
|
309 | 309 | (##core#set! ,convert? #f) ) ) |
310 | 310 | (##core#lambda () ,@body) |
311 | 311 | (##core#lambda () |
312 | | ;; Restore parameters to their original, saved values |
313 | | ,@(map (lambda (p s) `(,p ,s #f #t)) |
314 | | param-aliases saveds) )) ) ) ) ) ))) |
| 312 | ;; Swap parameters with their original, saved values. |
| 313 | ,@(map (lambda (p s t) |
| 314 | `(##core#let ((,t (,p))) |
| 315 | ;; Restore to old value. |
| 316 | (,p ,s #f #t) |
| 317 | ;; Save current value for later re-invocations. |
| 318 | (##core#set! ,s ,t))) |
| 319 | param-aliases saveds temps) )) ) ) ) ) ))) |
315 | 320 | |
316 | 321 | (##sys#extend-macro-environment |
317 | 322 | 'when '() |
diff --git a/tests/library-tests.scm b/tests/library-tests.scm
index 384ca40..cd2f6e9 100644
a
|
b
|
A |
587 | 587 | (assert (equal? original-error (current-error-port))) |
588 | 588 | (assert (equal? original-exception-handler (current-exception-handler)))) |
589 | 589 | |
| 590 | ;; Re-entering dynamic extent of a parameterize should not reset to |
| 591 | ;; original outer values but remember values when jumping out (another |
| 592 | ;; regression due to #1227, pointed out by Joo ChurlSoo in #1336). |
| 593 | |
| 594 | (let ((f (make-parameter 'a)) |
| 595 | (path '()) |
| 596 | (g (make-parameter 'g)) |
| 597 | (c #f)) |
| 598 | (let ((add (lambda () (set! path (cons (f) path))))) |
| 599 | (add) |
| 600 | (parameterize ((f 'b) |
| 601 | (g (call-with-current-continuation |
| 602 | (lambda (c0) (set! c c0) 'c)))) |
| 603 | (add) (f (g)) (add)) |
| 604 | (f 'd) |
| 605 | (add) |
| 606 | (if (< (length path) 8) |
| 607 | (c 'e) |
| 608 | (assert (equal? '(a b c d b e d b e d) (reverse path)))))) |
| 609 | |
| 610 | (let ((f (make-parameter 'a)) |
| 611 | (path '()) |
| 612 | (g (make-parameter 'g)) |
| 613 | (c #f)) |
| 614 | (let ((add (lambda () (set! path (cons (f) path))))) |
| 615 | (add) |
| 616 | (parameterize ((f 'b)) |
| 617 | (g (call-with-current-continuation (lambda (c0) (set! c c0) 'c))) |
| 618 | (add) (f (g)) (add)) |
| 619 | (f 'd) |
| 620 | (add) |
| 621 | (if (< (length path) 8) |
| 622 | (c 'e) |
| 623 | (assert (equal? '(a b c d c e d e e d) (reverse path)))))) |
| 624 | |
590 | 625 | ;;; vector and blob limits |
591 | 626 | |
592 | 627 | (assert-fail (make-blob -1)) |