Lift some blame and neg-party consing.
To avoid doing it every time the contract is checked.
This commit is contained in:
parent
9419778b1e
commit
5dc368585f
|
@ -47,8 +47,9 @@
|
||||||
mandatory-dom-kwd-proj ...
|
mandatory-dom-kwd-proj ...
|
||||||
optional-dom-kwd-proj ...
|
optional-dom-kwd-proj ...
|
||||||
rng-proj ...)
|
rng-proj ...)
|
||||||
|
(define blame+neg-party (cons blame neg-party))
|
||||||
#,(create-chaperone
|
#,(create-chaperone
|
||||||
#'blame #'neg-party #'blame-party-info #'f #'rng-ctcs
|
#'blame #'neg-party #'blame+neg-party #'blame-party-info #'f #'rng-ctcs
|
||||||
this-args
|
this-args
|
||||||
(for/list ([id (in-list (syntax->list #'(mandatory-dom-proj ...)))]
|
(for/list ([id (in-list (syntax->list #'(mandatory-dom-proj ...)))]
|
||||||
[mandatory-dom-proj (in-list mandatory-dom-projs)])
|
[mandatory-dom-proj (in-list mandatory-dom-projs)])
|
||||||
|
@ -124,7 +125,7 @@
|
||||||
(if pre? "pre" "post")
|
(if pre? "pre" "post")
|
||||||
condition-result)]))
|
condition-result)]))
|
||||||
|
|
||||||
(define-for-syntax (create-chaperone blame neg-party blame-party-info
|
(define-for-syntax (create-chaperone blame neg-party blame+neg-party blame-party-info
|
||||||
val rng-ctcs
|
val rng-ctcs
|
||||||
this-args
|
this-args
|
||||||
doms opt-doms
|
doms opt-doms
|
||||||
|
@ -134,6 +135,7 @@
|
||||||
rngs
|
rngs
|
||||||
post post/desc)
|
post post/desc)
|
||||||
(with-syntax ([blame blame]
|
(with-syntax ([blame blame]
|
||||||
|
[blame+neg-party blame+neg-party]
|
||||||
[val val])
|
[val val])
|
||||||
(with-syntax ([(pre ...)
|
(with-syntax ([(pre ...)
|
||||||
(cond
|
(cond
|
||||||
|
@ -170,7 +172,7 @@
|
||||||
#'(case-lambda
|
#'(case-lambda
|
||||||
[(rng-x ...)
|
[(rng-x ...)
|
||||||
(with-contract-continuation-mark
|
(with-contract-continuation-mark
|
||||||
(cons blame neg-party)
|
blame+neg-party
|
||||||
(let ()
|
(let ()
|
||||||
post ...
|
post ...
|
||||||
rng-results))]
|
rng-results))]
|
||||||
|
@ -182,7 +184,7 @@
|
||||||
(if assume-result-values?
|
(if assume-result-values?
|
||||||
#`(let-values ([(rng-x ...) #,stx])
|
#`(let-values ([(rng-x ...) #,stx])
|
||||||
(with-contract-continuation-mark
|
(with-contract-continuation-mark
|
||||||
(cons blame neg-party)
|
blame+neg-party
|
||||||
(let ()
|
(let ()
|
||||||
post ...
|
post ...
|
||||||
(values (rng-late-neg-projs rng-x neg-party) ...))))
|
(values (rng-late-neg-projs rng-x neg-party) ...))))
|
||||||
|
@ -297,7 +299,7 @@
|
||||||
arg-checking-expressions)])
|
arg-checking-expressions)])
|
||||||
#`(let-values ([(tmps ...)
|
#`(let-values ([(tmps ...)
|
||||||
(with-contract-continuation-mark
|
(with-contract-continuation-mark
|
||||||
(cons blame neg-party)
|
blame+neg-party
|
||||||
(values #,@arg-checking-expressions))])
|
(values #,@arg-checking-expressions))])
|
||||||
#,(if need-apply?
|
#,(if need-apply?
|
||||||
#`(apply val tmps ...)
|
#`(apply val tmps ...)
|
||||||
|
@ -368,7 +370,7 @@
|
||||||
;; - stamourv
|
;; - stamourv
|
||||||
(with-syntax ([basic-lambda #'(λ basic-params
|
(with-syntax ([basic-lambda #'(λ basic-params
|
||||||
(with-contract-continuation-mark
|
(with-contract-continuation-mark
|
||||||
(cons blame neg-party)
|
blame+neg-party
|
||||||
(let ()
|
(let ()
|
||||||
pre ... basic-return)))]
|
pre ... basic-return)))]
|
||||||
[basic-unsafe-lambda
|
[basic-unsafe-lambda
|
||||||
|
@ -386,13 +388,13 @@
|
||||||
[kwd-lambda-name (gen-id 'kwd-lambda)]
|
[kwd-lambda-name (gen-id 'kwd-lambda)]
|
||||||
[kwd-lambda #`(λ kwd-lam-params
|
[kwd-lambda #`(λ kwd-lam-params
|
||||||
(with-contract-continuation-mark
|
(with-contract-continuation-mark
|
||||||
(cons blame neg-party)
|
blame+neg-party
|
||||||
(let ()
|
(let ()
|
||||||
pre ... kwd-return)))])
|
pre ... kwd-return)))])
|
||||||
(cond
|
(cond
|
||||||
[(and (null? req-keywords) (null? opt-keywords))
|
[(and (null? req-keywords) (null? opt-keywords))
|
||||||
#`(arrow:arity-checking-wrapper val
|
#`(arrow:arity-checking-wrapper val
|
||||||
blame neg-party
|
blame neg-party blame+neg-party
|
||||||
basic-lambda
|
basic-lambda
|
||||||
basic-unsafe-lambda
|
basic-unsafe-lambda
|
||||||
basic-unsafe-lambda/result-values-assumed
|
basic-unsafe-lambda/result-values-assumed
|
||||||
|
@ -407,7 +409,7 @@
|
||||||
'(opt-kwd ...))]
|
'(opt-kwd ...))]
|
||||||
[(pair? req-keywords)
|
[(pair? req-keywords)
|
||||||
#`(arrow:arity-checking-wrapper val
|
#`(arrow:arity-checking-wrapper val
|
||||||
blame neg-party
|
blame neg-party blame+neg-party
|
||||||
void #t #f #f #f
|
void #t #f #f #f
|
||||||
kwd-lambda
|
kwd-lambda
|
||||||
#,min-method-arity
|
#,min-method-arity
|
||||||
|
@ -418,7 +420,7 @@
|
||||||
'(opt-kwd ...))]
|
'(opt-kwd ...))]
|
||||||
[else
|
[else
|
||||||
#`(arrow:arity-checking-wrapper val
|
#`(arrow:arity-checking-wrapper val
|
||||||
blame neg-party
|
blame neg-party blame+neg-party
|
||||||
basic-lambda #t #f #f #f
|
basic-lambda #t #f #f #f
|
||||||
kwd-lambda
|
kwd-lambda
|
||||||
#,min-method-arity
|
#,min-method-arity
|
||||||
|
|
|
@ -988,6 +988,7 @@
|
||||||
(for/list ([kwd (in-list (append mandatory-keywords optional-keywords))]
|
(for/list ([kwd (in-list (append mandatory-keywords optional-keywords))]
|
||||||
[kwd-proj (in-list (append mandatory-dom-kwd-projs optional-dom-kwd-projs))])
|
[kwd-proj (in-list (append mandatory-dom-kwd-projs optional-dom-kwd-projs))])
|
||||||
(cons kwd kwd-proj))))
|
(cons kwd kwd-proj))))
|
||||||
|
(define blame+neg-party (cons blame neg-party))
|
||||||
|
|
||||||
(define interposition-proc
|
(define interposition-proc
|
||||||
(make-keyword-procedure
|
(make-keyword-procedure
|
||||||
|
@ -1029,7 +1030,7 @@
|
||||||
(cons result-checker args-dealt-with)
|
(cons result-checker args-dealt-with)
|
||||||
args-dealt-with)))))
|
args-dealt-with)))))
|
||||||
|
|
||||||
(values (arrow:arity-checking-wrapper f blame neg-party
|
(values (arrow:arity-checking-wrapper f blame neg-party blame+neg-party
|
||||||
interposition-proc #f interposition-proc #f #f #f
|
interposition-proc #f interposition-proc #f #f #f
|
||||||
min-arity max-arity
|
min-arity max-arity
|
||||||
min-arity max-arity
|
min-arity max-arity
|
||||||
|
|
|
@ -230,11 +230,12 @@
|
||||||
(loop (cdr accepted) req-kwds (cdr opt-kwds))]
|
(loop (cdr accepted) req-kwds (cdr opt-kwds))]
|
||||||
[else #f]))])))
|
[else #f]))])))
|
||||||
|
|
||||||
(define-for-syntax (create-chaperone blame neg-party blame-party-info val pre post this-args
|
(define-for-syntax (create-chaperone blame neg-party blame+neg-party blame-party-info val pre post this-args
|
||||||
doms opt-doms dom-rest req-kwds opt-kwds
|
doms opt-doms dom-rest req-kwds opt-kwds
|
||||||
rngs rng-ctc-id)
|
rngs rng-ctc-id)
|
||||||
(with-syntax ([blame blame]
|
(with-syntax ([blame blame]
|
||||||
[neg-party neg-party]
|
[neg-party neg-party]
|
||||||
|
[blame+neg-party blame+neg-party]
|
||||||
[val val])
|
[val val])
|
||||||
(with-syntax ([(pre ...)
|
(with-syntax ([(pre ...)
|
||||||
(if pre
|
(if pre
|
||||||
|
@ -281,7 +282,7 @@
|
||||||
#'(case-lambda
|
#'(case-lambda
|
||||||
[(rng-x ...)
|
[(rng-x ...)
|
||||||
(with-contract-continuation-mark
|
(with-contract-continuation-mark
|
||||||
(cons blame neg-party)
|
blame+neg-party
|
||||||
(let ()
|
(let ()
|
||||||
post ...
|
post ...
|
||||||
rng-results))]
|
rng-results))]
|
||||||
|
@ -391,13 +392,13 @@
|
||||||
;; noticeable in my measurements so far.
|
;; noticeable in my measurements so far.
|
||||||
;; - stamourv
|
;; - stamourv
|
||||||
(with-contract-continuation-mark
|
(with-contract-continuation-mark
|
||||||
(cons blame neg-party)
|
blame+neg-party
|
||||||
(let ()
|
(let ()
|
||||||
pre ... basic-return)))]
|
pre ... basic-return)))]
|
||||||
[kwd-lambda-name (gen-id 'kwd-lambda)]
|
[kwd-lambda-name (gen-id 'kwd-lambda)]
|
||||||
[kwd-lambda #`(λ kwd-lam-params
|
[kwd-lambda #`(λ kwd-lam-params
|
||||||
(with-contract-continuation-mark
|
(with-contract-continuation-mark
|
||||||
(cons blame neg-party)
|
blame+neg-party
|
||||||
(let ()
|
(let ()
|
||||||
pre ... kwd-return)))])
|
pre ... kwd-return)))])
|
||||||
(with-syntax ([(basic-checker-name) (generate-temporaries '(basic-checker))])
|
(with-syntax ([(basic-checker-name) (generate-temporaries '(basic-checker))])
|
||||||
|
@ -405,7 +406,7 @@
|
||||||
[(and (null? req-keywords) (null? opt-keywords))
|
[(and (null? req-keywords) (null? opt-keywords))
|
||||||
#`(let-values ([(rng-checker-name ...) (values/drop rng-checker ...)])
|
#`(let-values ([(rng-checker-name ...) (values/drop rng-checker ...)])
|
||||||
(let ([basic-lambda-name basic-lambda])
|
(let ([basic-lambda-name basic-lambda])
|
||||||
(arity-checking-wrapper val blame neg-party
|
(arity-checking-wrapper val blame neg-party blame+neg-party
|
||||||
basic-lambda-name #f #f #f #f
|
basic-lambda-name #f #f #f #f
|
||||||
void
|
void
|
||||||
#,min-method-arity
|
#,min-method-arity
|
||||||
|
@ -417,7 +418,7 @@
|
||||||
[(pair? req-keywords)
|
[(pair? req-keywords)
|
||||||
#`(let-values ([(rng-checker-name ...) (values/drop rng-checker ...)])
|
#`(let-values ([(rng-checker-name ...) (values/drop rng-checker ...)])
|
||||||
(let ([kwd-lambda-name kwd-lambda])
|
(let ([kwd-lambda-name kwd-lambda])
|
||||||
(arity-checking-wrapper val blame neg-party
|
(arity-checking-wrapper val blame neg-party blame+neg-party
|
||||||
void #f #f #f #f
|
void #f #f #f #f
|
||||||
kwd-lambda-name
|
kwd-lambda-name
|
||||||
#,min-method-arity
|
#,min-method-arity
|
||||||
|
@ -430,7 +431,7 @@
|
||||||
#`(let-values ([(rng-checker-name ...) (values/drop rng-checker ...)])
|
#`(let-values ([(rng-checker-name ...) (values/drop rng-checker ...)])
|
||||||
(let ([basic-lambda-name basic-lambda]
|
(let ([basic-lambda-name basic-lambda]
|
||||||
[kwd-lambda-name kwd-lambda])
|
[kwd-lambda-name kwd-lambda])
|
||||||
(arity-checking-wrapper val blame neg-party
|
(arity-checking-wrapper val blame neg-party blame+neg-party
|
||||||
basic-lambda-name #f #f #f #f
|
basic-lambda-name #f #f #f #f
|
||||||
kwd-lambda-name
|
kwd-lambda-name
|
||||||
#,min-method-arity
|
#,min-method-arity
|
||||||
|
@ -447,7 +448,7 @@
|
||||||
;; basic-unsafe-lambda or not; note that basic-unsafe-lambda might
|
;; basic-unsafe-lambda or not; note that basic-unsafe-lambda might
|
||||||
;; also be #t, but that happens only when we know that basic-lambda
|
;; also be #t, but that happens only when we know that basic-lambda
|
||||||
;; can't be chosen (because there are keywords involved)
|
;; can't be chosen (because there are keywords involved)
|
||||||
(define (arity-checking-wrapper val blame neg-party basic-lambda
|
(define (arity-checking-wrapper val blame neg-party blame+neg-party basic-lambda
|
||||||
basic-unsafe-lambda
|
basic-unsafe-lambda
|
||||||
basic-unsafe-lambda/result-values-assumed
|
basic-unsafe-lambda/result-values-assumed
|
||||||
basic-unsafe-lambda/result-values-assumed/no-tail
|
basic-unsafe-lambda/result-values-assumed/no-tail
|
||||||
|
@ -490,7 +491,7 @@
|
||||||
(raise-no-keywords-arg blame #:missing-party neg-party val kwds))
|
(raise-no-keywords-arg blame #:missing-party neg-party val kwds))
|
||||||
(λ (kwds kwd-args . args)
|
(λ (kwds kwd-args . args)
|
||||||
(with-contract-continuation-mark
|
(with-contract-continuation-mark
|
||||||
(cons blame neg-party)
|
blame+neg-party
|
||||||
(let ()
|
(let ()
|
||||||
(define args-len (length args))
|
(define args-len (length args))
|
||||||
(unless (valid-number-of-args? args)
|
(unless (valid-number-of-args? args)
|
||||||
|
@ -516,7 +517,7 @@
|
||||||
(if (null? req-kwd)
|
(if (null? req-kwd)
|
||||||
(λ args
|
(λ args
|
||||||
(with-contract-continuation-mark
|
(with-contract-continuation-mark
|
||||||
(cons blame neg-party)
|
blame+neg-party
|
||||||
(let ()
|
(let ()
|
||||||
(unless (valid-number-of-args? args)
|
(unless (valid-number-of-args? args)
|
||||||
(define args-len (length args))
|
(define args-len (length args))
|
||||||
|
@ -895,8 +896,9 @@
|
||||||
[outer-lambda
|
[outer-lambda
|
||||||
#`(lambda (blame neg-party blame-party-info val rng-ctc-x
|
#`(lambda (blame neg-party blame-party-info val rng-ctc-x
|
||||||
dom-names ... kwd-names ... rng-names ...)
|
dom-names ... kwd-names ... rng-names ...)
|
||||||
|
(define blame+neg-party (cons blame neg-party))
|
||||||
#,(create-chaperone
|
#,(create-chaperone
|
||||||
#'blame #'neg-party #'blame-party-info #'val #f #f
|
#'blame #'neg-party #'blame+neg-party #'blame-party-info #'val #f #f
|
||||||
(syntax->list #'(this-params ...))
|
(syntax->list #'(this-params ...))
|
||||||
(syntax->list #'(dom-names ...)) null #f
|
(syntax->list #'(dom-names ...)) null #f
|
||||||
(map list (syntax->list #'(kwds ...))
|
(map list (syntax->list #'(kwds ...))
|
||||||
|
@ -1086,8 +1088,9 @@
|
||||||
mandatory-dom-kwd-proj ...
|
mandatory-dom-kwd-proj ...
|
||||||
optional-dom-kwd-proj ...
|
optional-dom-kwd-proj ...
|
||||||
rng-proj ...)
|
rng-proj ...)
|
||||||
|
(define blame+neg-party (cons blame neg-party))
|
||||||
#,(create-chaperone
|
#,(create-chaperone
|
||||||
#'blame #'neg-party #'blame-party-info #'f pre post
|
#'blame #'neg-party #'blame+neg-party #'blame-party-info #'f pre post
|
||||||
(syntax->list #'(this-parameter ...))
|
(syntax->list #'(this-parameter ...))
|
||||||
(syntax->list #'(mandatory-dom-proj ...))
|
(syntax->list #'(mandatory-dom-proj ...))
|
||||||
(syntax->list #'(optional-dom-proj ...))
|
(syntax->list #'(optional-dom-proj ...))
|
||||||
|
@ -1370,6 +1373,7 @@
|
||||||
(define dom-blame (blame-add-context blame "the domain of" #:swap? #t))
|
(define dom-blame (blame-add-context blame "the domain of" #:swap? #t))
|
||||||
(define rng-blame (blame-add-range-context blame))
|
(define rng-blame (blame-add-range-context blame))
|
||||||
(λ (val neg-party)
|
(λ (val neg-party)
|
||||||
|
(define blame+neg-party (cons blame neg-party))
|
||||||
(if (base-->d-rest-ctc ->d-stct)
|
(if (base-->d-rest-ctc ->d-stct)
|
||||||
(check-procedure/more val
|
(check-procedure/more val
|
||||||
(base-->d-mtd? ->d-stct)
|
(base-->d-mtd? ->d-stct)
|
||||||
|
@ -1391,7 +1395,7 @@
|
||||||
(make-keyword-procedure
|
(make-keyword-procedure
|
||||||
(λ (kwd-args kwd-arg-vals . raw-orig-args)
|
(λ (kwd-args kwd-arg-vals . raw-orig-args)
|
||||||
(with-contract-continuation-mark
|
(with-contract-continuation-mark
|
||||||
(cons blame neg-party)
|
blame+neg-party
|
||||||
(let* ([orig-args (if (base-->d-mtd? ->d-stct)
|
(let* ([orig-args (if (base-->d-mtd? ->d-stct)
|
||||||
(cdr raw-orig-args)
|
(cdr raw-orig-args)
|
||||||
raw-orig-args)]
|
raw-orig-args)]
|
||||||
|
@ -1421,7 +1425,7 @@
|
||||||
(if rng
|
(if rng
|
||||||
(list (λ orig-results
|
(list (λ orig-results
|
||||||
(with-contract-continuation-mark
|
(with-contract-continuation-mark
|
||||||
(cons blame neg-party)
|
blame+neg-party
|
||||||
(let* ([range-count (length rng)]
|
(let* ([range-count (length rng)]
|
||||||
[post-args (append orig-results raw-orig-args)]
|
[post-args (append orig-results raw-orig-args)]
|
||||||
[post-non-kwd-arg-count (+ non-kwd-ctc-count range-count)]
|
[post-non-kwd-arg-count (+ non-kwd-ctc-count range-count)]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user