Add "pop" field to $prompt

* module/language/cps.scm ($prompt): Add a "pop" field, indicating the
  continuation at which this prompt is popped.  The body of the prompt
  is dominated by the prompt, and post-dominated by the pop.  Adapt all
  builders and users.

* module/language/cps/closure-conversion.scm:
* module/language/cps/compile-rtl.scm:
* module/language/cps/slot-allocation.scm:
* module/language/cps/verify.scm:
* module/language/tree-il/compile-cps.scm: Adapt.

* module/language/cps/dfg.scm (visit-fun): Add an arc from the pop to
  the handler, to keep handler variables alive through the prompt body.
This commit is contained in:
Andy Wingo 2013-10-29 22:57:29 +01:00
commit 96af4a18b8
7 changed files with 31 additions and 17 deletions

View file

@ -217,12 +217,12 @@ convert functions to flat closures."
($continue k ($values args)))
'()))))
(($ $continue k ($ $prompt escape? tag handler))
(($ $continue k ($ $prompt escape? tag handler pop))
(convert-free-var
tag self bound
(lambda (tag)
(values (build-cps-term
($continue k ($prompt escape? tag handler)))
($continue k ($prompt escape? tag handler pop)))
'()))))
(_ (error "what" exp))))

View file

@ -272,7 +272,7 @@
(($ $primcall name args)
(error "unhandled primcall in seq context" name))
(($ $values ()) #f)
(($ $prompt escape? tag handler)
(($ $prompt escape? tag handler pop)
(match (lookup-cont handler cont-table)
(($ $ktrunc ($ $arity req () rest () #f) khandler-body)
(let ((receive-args (gensym "handler"))

View file

@ -655,9 +655,20 @@
(($ $values args)
(for-each use! args))
(($ $prompt escape? tag handler)
(($ $prompt escape? tag handler pop)
(use! tag)
(use-k! handler))
(use-k! handler)
;; Any continuation in the prompt body could cause an abort to
;; the handler, so in theory we could register the handler as
;; a successor of any block in the prompt body. That would be
;; inefficient, though, besides being a hack. Instead we take
;; advantage of the fact that pop continuation post-dominates
;; the prompt body, so we add a link from there to the
;; handler. This creates a primcall node with multiple
;; successors, which is not quite correct, but it does reflect
;; control flow. It is necessary to ensure that the live
;; variables in the handler are seen as live in the body.
(link-blocks! pop handler))
(($ $fun)
(when global?

View file

@ -402,7 +402,7 @@ are comparable with eqv?. A tmp slot may be used."
live-slots live-slots*
(compute-dst-slots))))
(($ $prompt escape? tag handler)
(($ $prompt escape? tag handler pop)
(match (lookup-cont handler (dfg-cont-table dfg))
(($ $ktrunc arity kargs)
(let* ((live-slots (allocate-prompt-handler! label live-slots))

View file

@ -132,10 +132,11 @@
(for-each (cut check-var <> v-env) arg))
(($ $values ((? symbol? arg) ...))
(for-each (cut check-var <> v-env) arg))
(($ $prompt escape? tag handler)
(($ $prompt escape? tag handler pop)
(unless (boolean? escape?) (error "escape? should be boolean" escape?))
(check-var tag v-env)
(check-var handler k-env))
(check-var handler k-env)
(check-var pop k-env))
(_
(error "unexpected expression" exp))))