fix class/c first-order check for interface contracts
This commit is contained in:
parent
52c74701ec
commit
14645b8cc5
|
@ -194,4 +194,17 @@
|
||||||
(ctest #f contract-first-order-passes?
|
(ctest #f contract-first-order-passes?
|
||||||
(class/c [m (->m integer? integer?)])
|
(class/c [m (->m integer? integer?)])
|
||||||
(class object%
|
(class object%
|
||||||
(define/public (m x y) x))))
|
(define/public (m x y) x)))
|
||||||
|
|
||||||
|
(ctest #f contract-first-order-passes?
|
||||||
|
(class/c [m (->m integer? integer?)])
|
||||||
|
(class* object% ((interface () [m (-> any/c integer? integer? any/c)]))
|
||||||
|
(define/public (m x y) x)))
|
||||||
|
(ctest #t contract-first-order-passes?
|
||||||
|
(class/c [m (-> any/c integer? integer?)])
|
||||||
|
(class* object% ((interface () [m (-> any/c integer? integer?)]))
|
||||||
|
(define/public (m x) x)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
)
|
||||||
|
|
|
@ -2817,9 +2817,12 @@ An example
|
||||||
[c (in-list (class/c-method-contracts ctc))])
|
[c (in-list (class/c-method-contracts ctc))])
|
||||||
(define mth (hash-ref method-ht m #f))
|
(define mth (hash-ref method-ht m #f))
|
||||||
(unless mth (fail "no public method ~a" m))
|
(unless mth (fail "no public method ~a" m))
|
||||||
(unless (contract-first-order-passes?
|
(define meth-proc
|
||||||
c
|
(let loop ([m/l (vector-ref methods mth)])
|
||||||
(vector-ref methods mth))
|
(cond
|
||||||
|
[(pair? m/l) (loop (car m/l))]
|
||||||
|
[else m/l])))
|
||||||
|
(unless (contract-first-order-passes? c meth-proc)
|
||||||
(fail "public method ~a doesn't match contract" m)))
|
(fail "public method ~a doesn't match contract" m)))
|
||||||
(unless (class/c-opaque? ctc)
|
(unless (class/c-opaque? ctc)
|
||||||
(for ([m (class/c-absents ctc)])
|
(for ([m (class/c-absents ctc)])
|
||||||
|
|
Loading…
Reference in New Issue
Block a user