From 14645b8cc5375d0d6a4a3428793e2811be83d4ed Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Fri, 13 Dec 2013 16:20:59 -0600 Subject: [PATCH] fix class/c first-order check for interface contracts --- .../tests/racket/contract/first-order.rkt | 15 ++++++++++++++- .../racket-test/tests/racket/contract/object.rkt | 2 +- racket/collects/racket/private/class-internal.rkt | 9 ++++++--- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/contract/first-order.rkt b/pkgs/racket-pkgs/racket-test/tests/racket/contract/first-order.rkt index f758a9d9ee..315611a262 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/contract/first-order.rkt +++ b/pkgs/racket-pkgs/racket-test/tests/racket/contract/first-order.rkt @@ -194,4 +194,17 @@ (ctest #f contract-first-order-passes? (class/c [m (->m integer? integer?)]) (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))) + + + + ) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/contract/object.rkt b/pkgs/racket-pkgs/racket-test/tests/racket/contract/object.rkt index 47f4377b34..bdec975267 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/contract/object.rkt +++ b/pkgs/racket-pkgs/racket-test/tests/racket/contract/object.rkt @@ -158,4 +158,4 @@ 'pos 'neg)]) (set-field! n pre-o #t) - (get-field n o)))) \ No newline at end of file + (get-field n o)))) diff --git a/racket/collects/racket/private/class-internal.rkt b/racket/collects/racket/private/class-internal.rkt index 8b007e4eb4..ef19a98177 100644 --- a/racket/collects/racket/private/class-internal.rkt +++ b/racket/collects/racket/private/class-internal.rkt @@ -2817,9 +2817,12 @@ An example [c (in-list (class/c-method-contracts ctc))]) (define mth (hash-ref method-ht m #f)) (unless mth (fail "no public method ~a" m)) - (unless (contract-first-order-passes? - c - (vector-ref methods mth)) + (define meth-proc + (let loop ([m/l (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))) (unless (class/c-opaque? ctc) (for ([m (class/c-absents ctc)])