immediate marking

svn: r13299
This commit is contained in:
Jay McCarthy 2009-01-28 15:30:36 +00:00
parent d518d5a32c
commit 254f924ebb
3 changed files with 144 additions and 50 deletions

View File

@ -2,6 +2,7 @@
(require (planet "test.ss" ("schematics" "schemeunit.plt" 2)) (require (planet "test.ss" ("schematics" "schemeunit.plt" 2))
(planet "util.ss" ("schematics" "schemeunit.plt" 2)) (planet "util.ss" ("schematics" "schemeunit.plt" 2))
web-server/lang/abort-resume) web-server/lang/abort-resume)
(require/expose web-server/lang/abort-resume (web-prompt))
(provide abort-resume-tests) (provide abort-resume-tests)
(define abort-resume-tests (define abort-resume-tests
@ -9,52 +10,146 @@
"Abort/Resume" "Abort/Resume"
(test-suite (test-suite
"current-saved-continuation-marks-and" "with-current-saved-continuation-marks-and"
(test-case
"Not in prompt"
(check-exn exn? (lambda () (current-saved-continuation-marks-and 'k1 'v1))))
(test-case (test-case
"Easy" "Easy"
(check-equal? (call-with-web-prompt (check-equal?
(lambda () (current-saved-continuation-marks-and 'k1 'v1))) (call-with-web-prompt
(make-immutable-hash (list (cons 'k1 'v1)))))
(test-case
"Preserve"
(check-equal? (call-with-web-prompt
(lambda () (lambda ()
(with-continuation-mark the-save-cm-key (make-immutable-hash (list (cons 'k2 'v2))) (with-current-saved-continuation-marks-and
(current-saved-continuation-marks-and 'k1 'v1)))) 'k1 'v1
(make-immutable-hash (lambda ()
(list (cons 'k1 'v1) (continuation-mark-set->list
(cons 'k2 'v2))))) (current-continuation-marks web-prompt)
the-save-cm-key)))))
(list (make-immutable-hash (list (cons 'k1 'v1))))))
(test-case (test-case
"Update" "Preserve (beta)"
(check-equal? (call-with-web-prompt (check-equal?
(call-with-web-prompt
(lambda ()
(with-continuation-mark the-save-cm-key
(make-immutable-hash (list (cons 'k2 'v2)))
(call-with-immediate-continuation-mark
the-save-cm-key
(lambda (old-cms)
(with-continuation-mark the-save-cm-key
(hash-set old-cms 'k1 'v1)
(continuation-mark-set->list
(current-continuation-marks web-prompt)
the-save-cm-key)))
(make-immutable-hash empty)))))
(list (make-immutable-hash
(list (cons 'k1 'v1)
(cons 'k2 'v2))))))
#;(test-case
"Preserve"
(check-equal?
(call-with-web-prompt
(lambda ()
(with-continuation-mark the-save-cm-key
(make-immutable-hash (list (cons 'k2 'v2)))
(with-current-saved-continuation-marks-and
'k1 'v1
(lambda ()
(continuation-mark-set->list
(current-continuation-marks web-prompt)
the-save-cm-key))))))
(list (make-immutable-hash
(list (cons 'k1 'v1)
(cons 'k2 'v2))))))
(test-case
"Update (beta)"
(check-equal?
(call-with-web-prompt
(lambda () (lambda ()
(with-continuation-mark the-save-cm-key (with-continuation-mark the-save-cm-key
(make-immutable-hash (list (cons 'k2 'v2) (cons 'k1 'v3))) (make-immutable-hash (list (cons 'k2 'v2) (cons 'k1 'v3)))
(current-saved-continuation-marks-and 'k1 'v1))))
(make-immutable-hash
(list (cons 'k1 'v1)
(cons 'k2 'v2)))))
(test-case (call-with-immediate-continuation-mark
"Double" the-save-cm-key
(check-equal? (call-with-web-prompt (lambda (old-cms)
(with-continuation-mark the-save-cm-key
(hash-set old-cms 'k1 'v1)
(continuation-mark-set->list
(current-continuation-marks web-prompt)
the-save-cm-key)))
(make-immutable-hash empty)))))
(list (make-immutable-hash
(list (cons 'k1 'v1)
(cons 'k2 'v2))))))
#;(test-case
"Update"
(check-equal?
(call-with-web-prompt
(lambda () (lambda ()
(with-continuation-mark the-save-cm-key (with-continuation-mark the-save-cm-key
(make-immutable-hash (list (cons 'k3 'v1) (cons 'k4 'v0))) (make-immutable-hash (list (cons 'k2 'v2) (cons 'k1 'v3)))
(with-current-saved-continuation-marks-and
'k1 'v1
(lambda ()
(continuation-mark-set->list
(current-continuation-marks web-prompt)
the-save-cm-key))))))
(list (make-immutable-hash
(list (cons 'k1 'v1)
(cons 'k2 'v2))))))
(test-case
"Double (beta)"
(check-equal?
(call-with-web-prompt
(lambda ()
(with-continuation-mark the-save-cm-key
(make-immutable-hash (list (cons 'k3 'v1) (cons 'k4 'v2)))
((lambda (x) x) ((lambda (x) x)
(with-continuation-mark the-save-cm-key (with-continuation-mark the-save-cm-key
(make-immutable-hash (list (cons 'k2 'v2) (cons 'k1 'v3))) (make-immutable-hash (list (cons 'k2 'v2) (cons 'k1 'v3)))
(current-saved-continuation-marks-and 'k1 'v1))))))
(make-immutable-hash (call-with-immediate-continuation-mark
the-save-cm-key
(lambda (old-cms)
(with-continuation-mark the-save-cm-key
(hash-set old-cms 'k1 'v1)
(continuation-mark-set->list
(current-continuation-marks web-prompt)
the-save-cm-key)))
(make-immutable-hash empty)))))))
(list (make-immutable-hash
(list (cons 'k1 'v1) (list (cons 'k1 'v1)
(cons 'k2 'v2)))))) (cons 'k2 'v2)))
(make-immutable-hash
(list (cons 'k3 'v1)
(cons 'k4 'v2))))))
#;(test-case
"Double"
(check-equal?
(call-with-web-prompt
(lambda ()
(with-continuation-mark the-save-cm-key
(make-immutable-hash (list (cons 'k3 'v1) (cons 'k4 'v2)))
((lambda (x) x)
(with-continuation-mark the-save-cm-key
(make-immutable-hash (list (cons 'k2 'v2) (cons 'k1 'v3)))
(with-current-saved-continuation-marks-and
'k1 'v1
(lambda ()
(continuation-mark-set->list
(current-continuation-marks web-prompt)
the-save-cm-key))))))))
(list (make-immutable-hash
(list (cons 'k1 'v1)
(cons 'k2 'v2)))
(make-immutable-hash
(list (cons 'k3 'v1)
(cons 'k4 'v2)))))))
(test-suite (test-suite
"activation-record-list" "activation-record-list"

View File

@ -12,13 +12,14 @@
(define safe-call? (make-mark-key)) (define safe-call? (make-mark-key))
(define web-prompt (make-continuation-prompt-tag 'web)) (define web-prompt (make-continuation-prompt-tag 'web))
(define (current-saved-continuation-marks-and key val) (define (with-current-saved-continuation-marks-and key val thnk)
(define c (call-with-immediate-continuation-mark
(continuation-mark-set->list (current-continuation-marks web-prompt) the-save-cm-key
the-save-cm-key)) (lambda (old-cms)
(if (empty? c) (with-continuation-mark the-save-cm-key
(make-immutable-hash (list (cons key val))) (hash-set old-cms key val)
(hash-set (first c) key val))) (thnk)))
(make-immutable-hash empty)))
;; current-continuation-as-list: -> (listof value) ;; current-continuation-as-list: -> (listof value)
;; check the safety marks and return the list of marks representing the continuation ;; check the safety marks and return the list of marks representing the continuation
@ -173,7 +174,7 @@
[safe-call? mark-key?] [safe-call? mark-key?]
[the-undef undef?] [the-undef undef?]
[activation-record-list (-> saved-context?)] [activation-record-list (-> saved-context?)]
[current-saved-continuation-marks-and (any/c any/c . -> . cms?)] [with-current-saved-continuation-marks-and (any/c any/c (-> any/c) . -> . any/c)]
[kont-append-fun (kont? procedure? . -> . kont?)] [kont-append-fun (kont? procedure? . -> . kont?)]
;; "CLIENT" INTERFACE ;; "CLIENT" INTERFACE

View File

@ -74,10 +74,8 @@
(markit (markit
(quasisyntax/loc stx (quasisyntax/loc stx
(with-continuation-mark #,ke-prime #,me-prime (with-continuation-mark #,ke-prime #,me-prime
(with-continuation-mark (#%plain-app with-current-saved-continuation-marks-and #,ke-prime #,me-prime
the-save-cm-key (#%plain-lambda () #,be-prime))))))]
(#%plain-app current-saved-continuation-marks-and #,ke-prime #,me-prime)
#,be-prime)))))]
[(#%plain-app call/cc w) [(#%plain-app call/cc w)
(let-values ([(cm ref-to-cm) (generate-formal 'current-marks stx)] (let-values ([(cm ref-to-cm) (generate-formal 'current-marks stx)]
[(x ref-to-x) (generate-formal 'x stx)]) [(x ref-to-x) (generate-formal 'x stx)])