Actually, these have slightly different conditions. super contracts require

an overrideable method (augride is okay), whereas override contracts require
a method which has never been augmentable (i.e. no pubments or overments).

svn: r18162
This commit is contained in:
Stevie Strickland 2010-02-18 22:11:01 +00:00
parent 87c5e94fc3
commit a7d8507e3c

View File

@ -2402,22 +2402,21 @@
(define method-ht (class-method-ht cls)) (define method-ht (class-method-ht cls))
(define beta-methods (class-beta-methods cls)) (define beta-methods (class-beta-methods cls))
(define meth-flags (class-meth-flags cls)) (define meth-flags (class-meth-flags cls))
(define (check-overrideable m)
(let ([index (hash-ref method-ht m #f)])
(unless index
(failed "no public method ~a" m))
(let ([flag (vector-ref meth-flags index)])
(when (eq? flag 'final)
(failed "method ~a is final, not overrideable" m))
(when (eq? flag 'augmentable)
(failed "method ~a is augmentable, not overrideable" m)))))
(unless (class? cls) (unless (class? cls)
(failed "not a class")) (failed "not a class"))
(for ([m (class/c-methods ctc)]) (for ([m (class/c-methods ctc)])
(unless (hash-ref method-ht m #f) (unless (hash-ref method-ht m #f)
(failed "no public method ~a" m))) (failed "no public method ~a" m)))
(for ([m (class/c-overrides ctc)]) (for ([m (class/c-overrides ctc)])
(check-overrideable m)) (let ([index (hash-ref method-ht m #f)])
(unless index
(failed "no public method ~a" m))
(let ([vec (vector-ref beta-methods index)])
(unless (zero? (vector-length vec))
(failed "method ~a was previously augmentable" m)))
(let ([flag (vector-ref meth-flags index)])
(when (eq? flag 'final)
(failed "method ~a is final, not overrideable" m)))))
(for ([m (class/c-augments ctc)]) (for ([m (class/c-augments ctc)])
(let ([index (hash-ref method-ht m #f)]) (let ([index (hash-ref method-ht m #f)])
(unless index (unless index
@ -2426,7 +2425,14 @@
(when (zero? (vector-length vec)) (when (zero? (vector-length vec))
(failed "method ~a has never been augmentable" m))))) (failed "method ~a has never been augmentable" m)))))
(for ([s (class/c-supers ctc)]) (for ([s (class/c-supers ctc)])
(check-overrideable s)) (let ([index (hash-ref method-ht s #f)])
(unless index
(failed "no public method ~a" s))
(let ([flag (vector-ref meth-flags index)])
(when (eq? flag 'final)
(failed "method ~a is final, not overrideable" s))
(when (eq? flag 'augmentable)
(failed "method ~a is augmentable, not overrideable" s)))))
(for ([i (class/c-inners ctc)]) (for ([i (class/c-inners ctc)])
(let ([index (hash-ref method-ht i #f)]) (let ([index (hash-ref method-ht i #f)])
(unless index (unless index