diff --git a/collects/tests/racket/chaperone.rktl b/collects/tests/racket/chaperone.rktl index bbf7bc40f1..44b27e837a 100644 --- a/collects/tests/racket/chaperone.rktl +++ b/collects/tests/racket/chaperone.rktl @@ -533,6 +533,8 @@ ;; Avoid printign hash-table argument, which implicitly uses `ref': (let ([got (apply proc args)]) (test #t (format "~s ~s ~s" proc val got) (equal? val got))))]) + (test #f hash-iterate-first h1) + (test #f hash-iterate-first h2) (test #f hash-ref h1 'key #f) (test '(#f #f #f #f #f #f) list get-k get-v set-k set-v remove-k access-k) (test 'nope hash-ref h2 'key 'nope) @@ -540,6 +542,9 @@ (set! get-k #f) (test (void) hash-set! h1 'key 'val) (test '(#f #f #f #f #f #f) list get-k get-v set-k set-v remove-k access-k) + (test #f not (hash-iterate-first h1)) + (test #f not (hash-iterate-first h2)) + (test #f hash-iterate-next h2 (hash-iterate-first h2)) (test 'val hash-ref h1 'key #f) (test '(#f #f #f #f #f #f) list get-k get-v set-k set-v remove-k access-k) (test 'val hash-ref h2 'key #f) @@ -723,4 +728,10 @@ ;; ---------------------------------------- +(test #t equal? + (chaperone-procedure add1 void) + (chaperone-procedure add1 void)) + +;; ---------------------------------------- + (report-errs) diff --git a/src/racket/src/list.c b/src/racket/src/list.c index 8b479b793d..9a9c5d7ee7 100644 --- a/src/racket/src/list.c +++ b/src/racket/src/list.c @@ -2397,11 +2397,16 @@ static Scheme_Object *hash_table_for_each(int argc, Scheme_Object *argv[]) static Scheme_Object *hash_table_next(const char *name, int start, int argc, Scheme_Object *argv[]) { - if (SCHEME_HASHTP(argv[0])) { + Scheme_Object *o = argv[0]; + + if (SCHEME_NP_CHAPERONEP(o)) + o = SCHEME_CHAPERONE_VAL(o); + + if (SCHEME_HASHTP(o)) { Scheme_Hash_Table *hash; int i, sz; - hash = (Scheme_Hash_Table *)argv[0]; + hash = (Scheme_Hash_Table *)o; sz = hash->size; if (start >= 0) { @@ -2414,21 +2419,21 @@ static Scheme_Object *hash_table_next(const char *name, int start, int argc, Sch } return scheme_false; - } else if (SCHEME_HASHTRP(argv[0])) { + } else if (SCHEME_HASHTRP(o)) { int v; - v = scheme_hash_tree_next((Scheme_Hash_Tree *)argv[0], start); + v = scheme_hash_tree_next((Scheme_Hash_Tree *)o, start); if (v == -1) return scheme_false; else if (v == -2) return NULL; else return scheme_make_integer(v); - } else if (SCHEME_BUCKTP(argv[0])) { + } else if (SCHEME_BUCKTP(o)) { Scheme_Bucket_Table *hash; Scheme_Bucket *bucket; int i, sz; - hash = (Scheme_Bucket_Table *)argv[0]; + hash = (Scheme_Bucket_Table *)o; sz = hash->size;