diff --git a/collects/scheme/private/class-internal.ss b/collects/scheme/private/class-internal.ss index 0abfac5260..d64eebcdeb 100644 --- a/collects/scheme/private/class-internal.ss +++ b/collects/scheme/private/class-internal.ss @@ -4378,9 +4378,9 @@ [ext-field-ref (vector-ref old-ext-refs n)] [ext-field-set (vector-ref old-ext-sets n)]) (vector-set! int-field-refs n (λ (o) (int-field-ref obj))) - (vector-set! int-field-sets n (λ (o) (int-field-set obj))) + (vector-set! int-field-sets n (λ (o v) (int-field-set obj v))) (vector-set! ext-field-refs n (λ (o) (ext-field-ref obj))) - (vector-set! ext-field-sets n (λ (o) (ext-field-set obj)))))) + (vector-set! ext-field-sets n (λ (o v) (ext-field-set obj v)))))) ;; Handle external field contracts (unless (null? fields) diff --git a/collects/tests/mzscheme/contract-test.ss b/collects/tests/mzscheme/contract-test.ss index 2d35de9984..81e3558b10 100644 --- a/collects/tests/mzscheme/contract-test.ss +++ b/collects/tests/mzscheme/contract-test.ss @@ -5142,7 +5142,6 @@ ; ;;;; ; ;;; -#| (test/pos-blame 'object/c-first-order-object-1 '(contract (object/c) @@ -5184,7 +5183,85 @@ (new (class object% (super-new) (field [n 3]))) 'pos 'neg)) -|# + + (test/spec-passed/result + 'object/c-higher-order-field-1 + '(get-field + n + (contract (object/c (field [n number?])) + (new (class object% (super-new) (field [n 3]))) + 'pos + 'neg)) + 3) + + (test/pos-blame + 'object/c-higher-order-field-2 + '(get-field + n + (contract (object/c (field [n number?])) + (new (class object% (super-new) (field [n #t]))) + 'pos + 'neg))) + + (test/spec-passed/result + 'object/c-higher-order-field-3 + '(let ([o (contract (object/c (field [n number?])) + (new (class object% (super-new) (field [n 3]))) + 'pos + 'neg)]) + (set-field! n o 5) + (get-field n o)) + 5) + + (test/neg-blame + 'object/c-higher-order-field-4 + '(let ([o (contract (object/c (field [n number?])) + (new (class object% (super-new) (field [n 3]))) + 'pos + 'neg)]) + (set-field! n o #t))) + + (test/spec-passed/result + 'object/c-higher-order-field-5 + '(let* ([pre-o (new (class object% (super-new) (field [n 3])))] + [o (contract (object/c (field [n number?])) + pre-o + 'pos + 'neg)]) + (set-field! n pre-o 5) + (get-field n o)) + 5) + + (test/spec-passed/result + 'object/c-higher-order-field-6 + '(let* ([pre-o (new (class object% (super-new) (field [n 3])))] + [o (contract (object/c (field [n number?])) + pre-o + 'pos + 'neg)]) + (set-field! n o 5) + (get-field n pre-o)) + 5) + + (test/neg-blame + 'object/c-higher-order-field-7 + '(let* ([pre-o (new (class object% (super-new) (field [n 3])))] + [o (contract (object/c (field [n number?])) + pre-o + 'pos + 'neg)]) + (set-field! n o #t) + (get-field n pre-o))) + + (test/pos-blame + 'object/c-higher-order-field-8 + '(let* ([pre-o (new (class object% (super-new) (field [n 3])))] + [o (contract (object/c (field [n number?])) + pre-o + 'pos + 'neg)]) + (set-field! n pre-o #t) + (get-field n o))) ; ;