From a9311535538534b2e7c5487d4b0737b840a37e58 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Sat, 1 Jun 2013 07:55:01 -0500 Subject: [PATCH] fix a bug in is-a? This bug has been in is-a? since at least 5.2; it turns some errors into #f. Hopefully no code is actually relying on this bad behavior... --- collects/racket/private/class-internal.rkt | 5 ++--- collects/tests/racket/object.rktl | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/collects/racket/private/class-internal.rkt b/collects/racket/private/class-internal.rkt index 8c095b3bf1..ad46528c83 100644 --- a/collects/racket/private/class-internal.rkt +++ b/collects/racket/private/class-internal.rkt @@ -4651,9 +4651,8 @@ An example (define (is-a? v c) (cond - [(not (object? v)) #f] - [(class? c) ((class-object? (class-orig-cls c)) v)] - [(interface? c) (implementation? (object-ref v) c)] + [(class? c) (and (object? v) ((class-object? (class-orig-cls c)) v))] + [(interface? c) (and (object? v) (implementation? (object-ref v) c))] [else (raise-argument-error 'is-a? "(or/c class? interface?)" 1 v c)])) (define (subclass? v c) diff --git a/collects/tests/racket/object.rktl b/collects/tests/racket/object.rktl index 4eaac35522..35f2047d01 100644 --- a/collects/tests/racket/object.rktl +++ b/collects/tests/racket/object.rktl @@ -436,6 +436,10 @@ (test #t is-a? picky (class->interface picky-fish%)) (test #f is-a? red-fish (class->interface picky-fish%)) +(err/rt-test (is-a? 1 2) exn:fail?) +(err/rt-test (is-a? red-fish 2) exn:fail?) +(test #f is-a? 11 eater<%>) + (err/rt-test (instantiate fish% () (bad-size 10)) exn:fail:object?) (err/rt-test (instantiate fish% () (size 10) (size 12)) exn:fail:object?) (err/rt-test (instantiate fish% (10) (size 12)) exn:fail:object?)