From a7038173aa7e926b721d9fc06ec21fbcd41bd6e8 Mon Sep 17 00:00:00 2001 From: Cameron Moy Date: Sat, 21 Nov 2020 03:48:41 -0500 Subject: [PATCH] fix contract on `impersonate-async-channel` --- .../tests/racket/async-channel.rktl | 35 ++++++++++++++++++- racket/collects/racket/async-channel.rkt | 2 +- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/pkgs/racket-test-core/tests/racket/async-channel.rktl b/pkgs/racket-test-core/tests/racket/async-channel.rktl index 2bbbbedf92..b651de3e41 100644 --- a/pkgs/racket-test-core/tests/racket/async-channel.rktl +++ b/pkgs/racket-test-core/tests/racket/async-channel.rktl @@ -89,5 +89,38 @@ (check-limited 1) (check-limited 3) -(report-errs) +;; async channel chaperone and impersonator +(let () + (define (record ch c-or-i go) + (define trace '()) + (define (add-to-trace ele) (set! trace (cons ele trace))) + (go (c-or-i ch + (λ (ele) (add-to-trace (list 'get ele)) ele) + (λ (ele) (add-to-trace (list 'put ele)) ele))) + (reverse trace)) + + (define (test-chaperone/impersonator c-or-i) + (test '((put 1) (put 2) (get 1) (get 2)) + record + (make-async-channel) + c-or-i + (λ (ch) + (async-channel-put ch 1) + (async-channel-put ch 2) + (async-channel-get ch) + (async-channel-get ch))) + (test '((put 1) (get 1) (put 2) (get 2)) + record + (make-async-channel) + c-or-i + (λ (ch) + (async-channel-put ch 1) + (async-channel-get ch) + (async-channel-put ch 2) + (async-channel-get ch)))) + + (test-chaperone/impersonator chaperone-async-channel) + (test-chaperone/impersonator impersonate-async-channel)) + +(report-errs) diff --git a/racket/collects/racket/async-channel.rkt b/racket/collects/racket/async-channel.rkt index a8b767d47a..616e1f19ab 100644 --- a/racket/collects/racket/async-channel.rkt +++ b/racket/collects/racket/async-channel.rkt @@ -273,7 +273,7 @@ (any/c . -> . any/c) (any/c . -> . any/c)) #:rest (listof any/c) - . ->* . (and/c chaperone? async-channel?))) + . ->* . (and/c impersonator? async-channel?))) (chaperone-async-channel ((async-channel? (any/c . -> . any/c) (any/c . -> . any/c))