svn: r1816
This commit is contained in:
John Clements 2006-01-12 22:34:11 +00:00
parent 2ab94a5bf3
commit 634d76c5af

View File

@ -277,8 +277,8 @@
(define (result-value-break vals-list) (define (result-value-break vals-list)
(break (current-continuation-marks) 'result-value-break vals-list)) (break (current-continuation-marks) 'result-value-break vals-list))
(define (result-value-break/begin vals-list) (define (normal-break/values vals-list)
(break (current-continuation-marks) 'result-value-break/begin vals-list)) (break (current-continuation-marks) 'normal-break/values vals-list))
(define (exp-finished-break info-list) (define (exp-finished-break info-list)
(break #f 'expr-finished-break info-list)) (break #f 'expr-finished-break info-list))
@ -315,10 +315,9 @@
(define return-value-wrap (define return-value-wrap
(return-value-wrap-maker result-value-break)) (return-value-wrap-maker result-value-break))
;; wrap a return-value-break/begin around exp ;; wrap a normal-break/values around exp
(define return-value-wrap/begin (define normal-break/values-wrap
(return-value-wrap-maker result-value-break/begin)) (return-value-wrap-maker normal-break/values))
(define (make-define-struct-break exp) (define (make-define-struct-break exp)
(lambda () (lambda ()
@ -416,13 +415,13 @@
;; no pre-break, non-tail w.r.t. new bindings ;; no pre-break, non-tail w.r.t. new bindings
[let-body-recur/first [let-body-recur/first
(lambda (exp) (lambda (exp)
(return-value-wrap/begin (normal-break/values-wrap
(non-tail-recur exp)))] (non-tail-recur exp)))]
;; yes pre-break, non-tail w.r.t. new bindings ;; yes pre-break, non-tail w.r.t. new bindings
[let-body-recur/middle [let-body-recur/middle
(lambda (exp) (lambda (exp)
(return-value-wrap/begin (normal-break/values-wrap
(annotate/inner exp null #t #f)))] (annotate/inner exp null #t #f)))]
;; yes pre-break, tail w.r.t. new bindings: ;; yes pre-break, tail w.r.t. new bindings:
@ -430,6 +429,8 @@
(lambda (exp bindings) (lambda (exp bindings)
(annotate/inner exp (binding-set-union (list tail-bound bindings)) #f procedure-name-info))] (annotate/inner exp (binding-set-union (list tail-bound bindings)) #f procedure-name-info))]
;; different flavors of make-debug-info allow users to provide only the needed fields:
[make-debug-info-normal (lambda (free-bindings) [make-debug-info-normal (lambda (free-bindings)
(make-debug-info exp tail-bound free-bindings 'none #t))] (make-debug-info exp tail-bound free-bindings 'none #t))]
[make-debug-info-app (lambda (tail-bound free-bindings label) [make-debug-info-app (lambda (tail-bound free-bindings label)
@ -456,6 +457,17 @@
annotated) annotated)
free-vars))] free-vars))]
; @@ @@ @@
; @ @ @
; @ $@$: @@+-$: @-@$ $@:@ $@$:
; @ -@ @+@$@ @+ *$ $* *@ -@
; @ -$@$@ @ @ @ @ @ @ @ -$@$@
; @ $* @ @ @ @ @ @ @ @ $* @
; @ @- *@ @ @ @ @ +$ $* *@ @- *@
; @@@@@ -$$-@@@@@@@@@@@+@$ $@:@@ -$$-@@
;
[lambda-clause-abstraction [lambda-clause-abstraction
(lambda (clause) (lambda (clause)
(with-syntax ([(args-stx . bodies) clause]) (with-syntax ([(args-stx . bodies) clause])
@ -503,6 +515,17 @@
(normal-bundle free-varrefs captured)))] (normal-bundle free-varrefs captured)))]
; @@
; @ @
; @ -@@$ @@@@@
; @ $ -$ @
; @ @@@@@ @
; @ $ @
; @ +: @: :$
; @@@@@ $@@+ :@@$-
; The let transformation is complicated. ; The let transformation is complicated.
; here's a sample transformation (not including 'break's): ; here's a sample transformation (not including 'break's):
;(let-values ([(a b c) e1] [(d e) e2]) e3) ;(let-values ([(a b c) e1] [(d e) e2]) e3)
@ -635,7 +658,7 @@
;; pulling out begin abstraction! ;; pulling out begin abstraction!
;;; bLECCh! I think I can do this with a MAP, rather than a fold. ;;; bLECCh! I think I can do this with a MAP, rather than a fold.
[begin-abstraction #;[begin-abstraction
(lambda (bodies) (lambda (bodies)
(if (if
@ -679,12 +702,24 @@
)] )]
; @ :@@$
; @:
; -@@ @@@@@
; @ @
; @ @
; @ @
; @ @
; @@@@@ @@@@@
; if-abstraction: (-> syntax? syntax? (union false/c syntax?) (values syntax? varref-set?)) ; if-abstraction: (-> syntax? syntax? (union false/c syntax?) (values syntax? varref-set?))
[if-abstraction [if-abstraction
(lambda (test then else) (lambda (test then else)
(let*-2vals (let*-2vals
([(annotated-test free-varrefs-test) ([(annotated-test free-varrefs-test)
(non-tail-recur test)] (non-tail-recur test)]
[test-with-break
(normal-break/values-wrap annotated-test)]
[(annotated-then free-varrefs-then) [(annotated-then free-varrefs-then)
(tail-recur then)] (tail-recur then)]
[(annotated-else free-varrefs-else) [(annotated-else free-varrefs-else)
@ -695,22 +730,24 @@
free-varrefs-then free-varrefs-then
free-varrefs-else))] free-varrefs-else))]
[annotated-if [annotated-if
#`(begin (set! #,if-temp #,annotated-test) (if else
(#,normal-break) (quasisyntax/loc exp (if #,test-with-break #,annotated-then #,annotated-else))
#,(if else (quasisyntax/loc exp (if #,test-with-break #,annotated-then)))])
(quasisyntax/loc exp (if #,if-temp #,annotated-then #,annotated-else))
(quasisyntax/loc exp (if #,if-temp #,annotated-then))))]
[wrapped (outer-wcm-wrap (make-debug-info-app (binding-set-union (list tail-bound (list if-temp)))
(varref-set-union (list free-varrefs (list if-temp)))
'none)
annotated-if)])
(2vals (2vals
(with-syntax ([test-var if-temp] (outer-wcm-wrap (make-debug-info-normal free-varrefs) annotated-if)
[wrapped-stx wrapped]
[unevaluated-stx *unevaluated*])
(syntax/loc exp (let ([test-var unevaluated-stx]) wrapped-stx)))
free-varrefs)))] free-varrefs)))]
; :@@$
; @:
; @@@ @@@ $@$: @@-$+ @@-$+ -@@$ @@@@@
; $ $ -@ @$ : @$ : $ -$ @
; +: ++ -$@$@ @ @ @@@@@ @
; $ $ $* @ @ @ $ @
; $:+ @- *@ @ @ +: @
; :@ -$$-@@ @@@@@ @@@@@ $@@+ @@@@@
[varref-abstraction [varref-abstraction
(lambda (var) (lambda (var)
(let*-2vals ([free-varrefs (list var)] (let*-2vals ([free-varrefs (list var)]
@ -787,7 +824,7 @@
[(begin . bodies-stx) [(begin . bodies-stx)
(begin (begin
(error 'annotate-inner "nothing expands into begin! : ~v" (syntax-object->datum exp)) (error 'annotate-inner "nothing expands into begin! : ~v" (syntax-object->datum exp))
(begin-abstraction (syntax->list #`bodies-stx)))] #;(begin-abstraction (syntax->list #`bodies-stx)))]
[(begin0 . bodies-stx) [(begin0 . bodies-stx)
(let*-2vals (let*-2vals
@ -817,6 +854,17 @@
#`letrec-values #`letrec-values
(lambda (bindings) (map (lambda (b) #`#,b) bindings)))] (lambda (bindings) (map (lambda (b) #`#,b) bindings)))]
; $
; @ @
; :@@+@ -@@$ @@@@@ @
; @$ -@ $ -$ @ @
; :@@$- @@@@@ @ @
; *@ $ @
; @ :@ +: @: :$
; $+@@: $@@+ :@@$- $
[(set! var val) [(set! var val)
(let*-2vals (let*-2vals
([(annotated-val val-free-varrefs) ([(annotated-val val-free-varrefs)
@ -825,28 +873,38 @@
[else (syntax var)]))] [else (syntax var)]))]
[free-varrefs (varref-set-union (list val-free-varrefs (list #`var)))] [free-varrefs (varref-set-union (list val-free-varrefs (list #`var)))]
[annotated-set! [annotated-set!
#`(begin (set! #,set!-temp #,annotated-val) (return-value-wrap
(#,normal-break) (quasisyntax/loc exp (set! var #,(normal-break/values-wrap annotated-val))))])
#,(return-value-wrap
(quasisyntax/loc exp (set! var #,set!-temp))))]
[wrapped (outer-wcm-wrap (make-debug-info-app (binding-set-union (list tail-bound (list set!-temp)))
(varref-set-union (list free-varrefs (list set!-temp)))
'none)
annotated-set!)])
(2vals (2vals
(with-syntax ([test-var set!-temp] (outer-wcm-wrap (make-debug-info-normal free-varrefs) annotated-set!)
[wrapped-stx wrapped]
[unevaluated-stx *unevaluated*])
(quasisyntax/loc exp (let ([test-var unevaluated-stx]) wrapped-stx)))
free-varrefs))] free-varrefs))]
; @
; $@-@@@@ @@ $@$ @@@@@ -@@$
; $- :@ @ @ $- -$ @ $ -$
; @ @ @ @ @ @ @ @@@@@
; @ @ @ @ @ @ @ $
; $- :@ @: +@ $- -$ @: :$ +:
; $@-@ :@$-@@ $@$ :@@$- $@@+
; @
; @@@
[(quote _) [(quote _)
(normal-bundle null exp)] (normal-bundle null exp)]
[(quote-syntax _) [(quote-syntax _)
(normal-bundle null exp)] (normal-bundle null exp)]
; @@@ @@@ $@+@ @@+-$:
; @ @ $+ -@ @+@$@
; $-@ @ @@@@@ @ @@@@@ @ @ @
; ++@+$ @ @ @ @
; :@@$+ $* -$ @ @ @
; -@$@* $@$- @@@@@@@
[(with-continuation-mark key mark body) [(with-continuation-mark key mark body)
;(let*-2vals ([(annotated-key free-varrefs-key) ;(let*-2vals ([(annotated-key free-varrefs-key)
; (non-tail-recur (syntax key))] ; (non-tail-recur (syntax key))]
@ -861,6 +919,19 @@
;) ;)
] ]
; @@ @ @
; @ @
; $@$: @@:@$- @@:@$- @ -@@ $@+@ $@$: @@@@@ -@@ $@$ @@:@@:
; -@ @: -$ @: -$ @ @ $+ -@ -@ @ @ $- -$ @+ :@
; -$@$@ @ @ @ @ @ @ @ -$@$@ @ @ @ @ @ @
; $* @ @ @ @ @ @ @ @ $* @ @ @ @ @ @ @
; @- *@ @: -$ @: -$ @ @ $* -$ @- *@ @: :$ @ $- -$ @ @
; -$$-@@ @-@$ @-@$ @@@@@ @@@@@ $@$- -$$-@@ :@@$- @@@@@ $@$ @@@ @@@
; @ @
; @@@ @@@
; [foot-wrap? ; [foot-wrap?
; (wcm-wrap debug-info annotated)]) ; (wcm-wrap debug-info annotated)])
; free-bindings))] ; free-bindings))]
@ -930,6 +1001,17 @@
;) ;)
free-varrefs))] free-varrefs))]
; @@
; @ @
; $@:@ $@$: @@@@@ @@ @@ @@+-$:
; $* *@ -@ @ @ @ @+@$@
; @ @ -$@$@ @ @ @ @ @ @
; @ @ $* @ @ @ @ @ @ @
; $* *@ @- *@ @: :$ @: +@ @ @ @
; $@:@@ -$$-@@ :@@$- :@$-@@@@@@@@@
[(#%datum . _) [(#%datum . _)
(normal-bundle null exp)] (normal-bundle null exp)]