mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
Nonlocal prompt returns cause all effects
* module/language/cps/effects-analysis.scm (expression-effects): Prompts cause &all-effects. I tried to limit this change to CSE but it was actually LICM that was borked, so better to be conservative * test-suite/tests/control.test ("escape-only continuations"): Add test.
This commit is contained in:
parent
c9910c6042
commit
0543ec96b2
2 changed files with 15 additions and 2 deletions
|
@ -517,7 +517,10 @@ is or might be a read or a write to the same location as A."
|
||||||
((or ($ $fun) ($ $rec) ($ $closure))
|
((or ($ $fun) ($ $rec) ($ $closure))
|
||||||
(&allocate &unknown-memory-kinds))
|
(&allocate &unknown-memory-kinds))
|
||||||
(($ $prompt)
|
(($ $prompt)
|
||||||
(&write-object &prompt))
|
;; Although the "main" path just writes &prompt, we don't know what
|
||||||
|
;; nonlocal predecessors of the handler do, so we conservatively
|
||||||
|
;; assume &all-effects.
|
||||||
|
&all-effects)
|
||||||
((or ($ $call) ($ $callk))
|
((or ($ $call) ($ $callk))
|
||||||
&all-effects)
|
&all-effects)
|
||||||
(($ $branch k exp)
|
(($ $branch k exp)
|
||||||
|
|
|
@ -103,7 +103,17 @@
|
||||||
(cons element prefix)))
|
(cons element prefix)))
|
||||||
'()
|
'()
|
||||||
lst)))))
|
lst)))))
|
||||||
(prefix 'a '(0 1 2 a 3 4 5)))))
|
(prefix 'a '(0 1 2 a 3 4 5))))
|
||||||
|
|
||||||
|
(pass-if "loop only in handler"
|
||||||
|
(let ((n #f))
|
||||||
|
(let lp ()
|
||||||
|
(or n
|
||||||
|
(call-with-prompt 'foo
|
||||||
|
(lambda ()
|
||||||
|
(set! n #t)
|
||||||
|
(abort-to-prompt 'foo))
|
||||||
|
(lambda (k) (lp))))))))
|
||||||
|
|
||||||
;;; And the case in which the compiler has to reify the continuation.
|
;;; And the case in which the compiler has to reify the continuation.
|
||||||
(with-test-prefix/c&e "reified continuations"
|
(with-test-prefix/c&e "reified continuations"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue