diff --git a/pkgs/racket-test-core/tests/racket/unsafe.rktl b/pkgs/racket-test-core/tests/racket/unsafe.rktl index 4238692bbc..1b4d33601d 100644 --- a/pkgs/racket-test-core/tests/racket/unsafe.rktl +++ b/pkgs/racket-test-core/tests/racket/unsafe.rktl @@ -679,4 +679,18 @@ (err/rt-test (unsafe-weak-hash-iterate-next ht i) exn:fail:contract? err-msg))) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Check that `unsafe-immutable-hash-...` proplerly handles an +;; indirection created by `read`: + +(test '((a . 1) (b . 2)) + sort + (for/list (((k v) (in-immutable-hash (read (open-input-string "#hash((a . 1) (b . 2))"))))) + (cons k v)) + < + #:key cdr) + +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (report-errs) diff --git a/racket/src/racket/src/hash.c b/racket/src/racket/src/hash.c index 74171890c6..36bff1e04b 100644 --- a/racket/src/racket/src/hash.c +++ b/racket/src/racket/src/hash.c @@ -2885,6 +2885,7 @@ XFORM_NONGCING void scheme_unsafe_hash_tree_subtree(Scheme_Object *obj, Scheme_O subtree = (Scheme_Hash_Tree *)SCHEME_CHAPERONE_VAL(obj); else subtree = (Scheme_Hash_Tree *)obj; + subtree = resolve_placeholder(subtree); i = SCHEME_INT_VAL(args); while (i >= (1<<(2*mzHAMT_LOG_WORD_SIZE))) { subtree = (Scheme_Hash_Tree *)subtree->els[i & ((1<= (1<<(2*mzHAMT_LOG_WORD_SIZE))) { @@ -2928,8 +2930,6 @@ Scheme_Object *scheme_unsafe_hash_tree_next(Scheme_Hash_Tree *ht, Scheme_Object i = i & ((1<