diff options
author | Andy Wingo <wingo@pobox.com> | 2013-06-16 15:06:59 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2013-06-16 16:51:28 +0200 |
commit | 9b965638e9e6cfe927807dbacc86212cc638967b (patch) | |
tree | 0e3293d96232e822fa92b5966d7afd570df9c8df /test-suite/tests/peval.test | |
parent | e6450062a19bf5d0072d117b69be95c2641c23ab (diff) | |
download | guile-9b965638e9e6cfe927807dbacc86212cc638967b.tar.gz |
<dynwind> no longer has "pre" or "post" fields
* module/language/tree-il.scm (<tree-il>): Remove pre and post fields
from <dynwind>. A dynwind now assumes that in normal entry and exit,
that the code runs the winders and unwinders using <seq> and
<let-values> and such things.
(parse-tree-il, unparse-tree-il, make-tree-il-folder, pre-post-order):
Adapt <dynwind> users.
* module/language/tree-il/analyze.scm (analyze-lexicals):
* module/language/tree-il/compile-glil.scm (flatten-lambda-case):
* module/language/tree-il/cse.scm (cse):
* module/language/tree-il/debug.scm (verify-tree-il):
* module/language/tree-il/effects.scm (make-effects-analyzer): Adapt.
* module/language/tree-il/peval.scm (peval):
* module/language/tree-il/primitives.scm (*primitive-expand-table*):
Produce tree-il that calls the winder and unwinder. Recognize
singly-valued dynamic-wind expressions.
* test-suite/tests/peval.test ("partial evaluation"): Add tests.
Diffstat (limited to 'test-suite/tests/peval.test')
-rw-r--r-- | test-suite/tests/peval.test | 56 |
1 files changed, 39 insertions, 17 deletions
diff --git a/test-suite/tests/peval.test b/test-suite/tests/peval.test index 45e322aad..7322d6120 100644 --- a/test-suite/tests/peval.test +++ b/test-suite/tests/peval.test @@ -1063,28 +1063,50 @@ (seq (call (toplevel random)) (const #t))) (pass-if-peval - ;; Non-constant guards get lexical bindings. + ;; Non-constant guards get lexical bindings, invocation of winder and + ;; unwinder lifted out. Unfortunately both have the generic variable + ;; name "tmp", so we can't distinguish them in this test, and they + ;; also collide in generic names with the single-value result from + ;; the dynwind; alack. (dynamic-wind foo (lambda () bar) baz) - (let (w u) (_ _) ((toplevel foo) (toplevel baz)) - (dynwind (lexical w _) - (call (lexical w _)) - (toplevel bar) - (call (lexical u _)) - (lexical u _)))) + (let (tmp tmp) (_ _) ((toplevel foo) (toplevel baz)) + (seq (call (lexical tmp _)) + (let (tmp) (_) ((dynwind (lexical tmp _) + (toplevel bar) + (lexical tmp _))) + (seq (call (lexical tmp _)) + (lexical tmp _)))))) (pass-if-peval ;; Constant guards don't need lexical bindings. (dynamic-wind (lambda () foo) (lambda () bar) (lambda () baz)) - (dynwind - (lambda () - (lambda-case - ((() #f #f #f () ()) (toplevel foo)))) - (toplevel foo) - (toplevel bar) - (toplevel baz) - (lambda () - (lambda-case - ((() #f #f #f () ()) (toplevel baz)))))) + (seq (toplevel foo) + (let (tmp) (_) ((dynwind (lambda () + (lambda-case + ((() #f #f #f () ()) (toplevel foo)))) + (toplevel bar) + (lambda () + (lambda-case + ((() #f #f #f () ()) (toplevel baz)))))) + (seq (toplevel baz) + (lexical tmp _))))) + + (pass-if-peval + ;; Dynwind bodies that return an unknown number of values need a + ;; let-values. + (dynamic-wind (lambda () foo) (lambda () (bar)) (lambda () baz)) + (seq (toplevel foo) + (let-values (dynwind (lambda () + (lambda-case + ((() #f #f #f () ()) (toplevel foo)))) + (call (toplevel bar)) + (lambda () + (lambda-case + ((() #f #f #f () ()) (toplevel baz))))) + (lambda-case + ((() #f vals #f () (_)) + (seq (toplevel baz) + (primcall @apply (primitive values) (lexical vals _)))))))) (pass-if-peval ;; Prompt is removed if tag is unreferenced |