From aa42163b705d96b76d37fcf0206ea85591ff8935 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 25 Feb 2019 10:41:30 -0700 Subject: [PATCH] fix place-channel handling of hash tables that contain impersonators Closes #2504 --- .../tests/racket/place-channel-chaperone.rkt | 44 +++++++++++++++++++ racket/src/racket/src/list.c | 5 ++- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 pkgs/racket-test/tests/racket/place-channel-chaperone.rkt diff --git a/pkgs/racket-test/tests/racket/place-channel-chaperone.rkt b/pkgs/racket-test/tests/racket/place-channel-chaperone.rkt new file mode 100644 index 0000000000..82aae4f545 --- /dev/null +++ b/pkgs/racket-test/tests/racket/place-channel-chaperone.rkt @@ -0,0 +1,44 @@ +#lang racket/base +(require racket/place) + +(define-values (i o) (place-channel)) + +(define (bounce v) + (place-channel-put o v) + (place-channel-get i)) + +(define (check a b) + (unless (equal? a b) + (error 'fail "different ~s ~s" a b))) + +(check (vector 1 2 3) + (bounce (chaperone-vector (vector 1 2 3) + (lambda (v i val) val) + (lambda (v i val) val)))) + +(check (hash 1 (vector 1 2 3)) + (bounce (hash 1 + (chaperone-vector (vector 1 2 3) + (lambda (v i val) val) + (lambda (v i val) val))))) + +(struct posn (x y) #:prefab) + +(check (posn (vector 1 2 3) 4) + (bounce (chaperone-struct (posn (vector 1 2 3) 4) + posn-x (lambda (s val) + (chaperone-vector val + (lambda (v i val) val) + (lambda (v i val) val)))))) + +(check (hash 'a (vector 1 2 3)) + (bounce (chaperone-hash (hash 'a (vector 1 2 3)) + (lambda (ht k) + (values k + (lambda (ht k val) + (chaperone-vector val + (lambda (v i val) val) + (lambda (v i val) val))))) + (lambda (ht k val) val) + (lambda (ht k) k) + (lambda (ht k) k)))) diff --git a/racket/src/racket/src/list.c b/racket/src/racket/src/list.c index 94f9d7a8eb..265bae00d6 100644 --- a/racket/src/racket/src/list.c +++ b/racket/src/racket/src/list.c @@ -3625,7 +3625,10 @@ Scheme_Object *scheme_chaperone_hash_table_filtered_copy(Scheme_Object *obj, Scheme_Object *a[3], *v, *v2, *idx, *key, *val; int is_eq, is_eqv; - v = SCHEME_CHAPERONE_VAL(obj); + if (SCHEME_CHAPERONEP(obj)) + v = SCHEME_CHAPERONE_VAL(obj); + else + v = obj; a[0] = obj; is_eq = SCHEME_TRUEP(scheme_hash_eq_p(1, a));