diff --git a/collects/scheme/private/class-internal.ss b/collects/scheme/private/class-internal.ss index 4bc812fb1d..77dc1ab0a7 100644 --- a/collects/scheme/private/class-internal.ss +++ b/collects/scheme/private/class-internal.ss @@ -2346,13 +2346,14 @@ (let ([super-int-methods (class-int-methods super)]) (for ([n (in-list dynamic-ctc-idxs)]) (let ([super-vec (vector-ref super-int-methods n)] - [old-vec (vector-ref int-methods n)]) + [old-vec (vector-ref int-methods n)] + [proj-vec (vector-ref dynamic-projs n)]) ;; If we didn't already update this in the override block above... (when (eq? super-vec old-vec) (let* ([dyn-idx (vector-ref dynamic-idxs n)] [new-vec (make-vector (add1 dyn-idx))] [clean-method (vector-ref old-vec (sub1 dyn-idx))] - [last-proj (vector-ref dynamic-projs (sub1 dyn-idx))]) + [last-proj (vector-ref proj-vec (sub1 dyn-idx))]) ;; Take the last updated set of projections and apply them to ;; each location. (for ([i (in-range dyn-idx)]) diff --git a/collects/tests/mzscheme/contract-test.ss b/collects/tests/mzscheme/contract-test.ss index 8af64a4f29..aa39e33590 100644 --- a/collects/tests/mzscheme/contract-test.ss +++ b/collects/tests/mzscheme/contract-test.ss @@ -4596,14 +4596,16 @@ (test/spec-passed 'class/c-higher-order-override-1 - '(let* ([c% (contract (class/c (override [m (-> any/c number? number?)])) + '(let* ([c% (contract (class/c (override [m (-> any/c integer? integer?)])) (class object% (super-new) (define/public (m x) x) (define/public (f x) (m x))) 'pos 'neg)] - [d% (class c% (super-new) (define/override (m x) (add1 (super m x))))]) - (send (new d%) f 3))) + [d% (class c% (super-new) + (define/public (g x) (m x)) + (define/override (m x) (add1 (super m x))))]) + (send (new d%) g 3.5))) (test/neg-blame 'class/c-higher-order-override-2 @@ -4662,7 +4664,7 @@ 'pos 'neg1)] [d% (contract (class/c (override [m (-> any/c integer? integer?)])) - (class c% (super-new) (define/public (g x) (add1 (m 3)))) + (class c% (super-new) (inherit m) (define/public (g x) (add1 (m 3)))) 'pos1 'neg)] [e% (class d% (super-new) (define/override (m x) (+ x (super m x))))]) @@ -4683,6 +4685,28 @@ [e% (class d% (super-new) (define/override (m x) (+ x (super m x))))]) (send (new e%) f 3))) + (test/spec-passed + 'class/c-higher-order-augment-1 + '(let* ([c% (contract (class/c (augment [m (-> any/c integer? integer?)])) + (class object% (super-new) + (define/pubment (m x) x) + (define/public (f x) (m (zero? x)))) + 'pos + 'neg)] + [d% (class c% (super-new) (inherit m) (define/public (g x) (m x)))]) + (send (new d%) f 3))) + + (test/neg-blame + 'class/c-higher-order-augment-2 + '(let* ([c% (contract (class/c (augment [m (-> any/c integer? integer?)])) + (class object% (super-new) + (define/pubment (m x) x) + (define/public (f x) (m (zero? x)))) + 'pos + 'neg)] + [d% (class c% (super-new) (inherit m) (define/public (g x) (m x)))]) + (send (new d%) g 3.5))) + ; ; ; ;; ;; ; ;;