Add instrumentation for box contracts.

This commit is contained in:
Vincent St-Amour 2016-01-05 14:52:18 -06:00
parent 379a3dd110
commit 9b7724167a
2 changed files with 20 additions and 3 deletions

View File

@ -210,4 +210,14 @@
'(let ()
((contract (case-> (-> neg-blame? any/c))
(λ (x) x) 'pos 'neg)
1))))
1)))
(test/spec-passed
'provide/contract23
'(unbox (contract (box/c neg-blame?) (box 1) 'pos 'neg)))
(test/spec-passed
'provide/contract24
'(set-box! (contract (box/c neg-blame?) (box 1) 'pos 'neg) 2))
)

View File

@ -141,6 +141,7 @@
(define pos-elem-r-proj (r-vfp box-blame))
(define neg-elem-w-proj (w-vfp (blame-swap box-blame)))
(λ (val neg-party)
(define blame+neg-party (cons blame neg-party))
(cond
[(check-box/c-np ctc val blame)
=>
@ -150,8 +151,14 @@
(box-immutable (pos-elem-r-proj (unbox val) neg-party))
(chaperone/impersonate-box
val
(λ (b v) (pos-elem-r-proj v neg-party))
(λ (b v) (neg-elem-w-proj v neg-party))
(λ (b v)
(with-contract-continuation-mark
blame+neg-party
(pos-elem-r-proj v neg-party)))
(λ (b v)
(with-contract-continuation-mark
blame+neg-party
(neg-elem-w-proj v neg-party)))
impersonator-prop:contracted ctc
impersonator-prop:blame (blame-add-missing-party blame neg-party)))])))))