fix place-channel handling of hash tables that contain impersonators

Closes #2504
This commit is contained in:
Matthew Flatt 2019-02-25 10:41:30 -07:00
parent 1c299e99db
commit aa42163b70
2 changed files with 48 additions and 1 deletions

View File

@ -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))))

View File

@ -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));