fix place-channel handling of hash tables that contain impersonators
Closes #2504
This commit is contained in:
parent
1c299e99db
commit
aa42163b70
44
pkgs/racket-test/tests/racket/place-channel-chaperone.rkt
Normal file
44
pkgs/racket-test/tests/racket/place-channel-chaperone.rkt
Normal 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))))
|
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue
Block a user