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:
parent
87c5e94fc3
commit
a7d8507e3c
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user