From ca6c67be682f6616ab989c10e5bcada2d260946a Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 15 Jul 2016 06:21:55 -0600 Subject: [PATCH] fix `unsafe-immutable-hash-...` on hash table from `read` When `read` parses a literal hash table, it inserts an placeholder just in case it's needed for cycles. The `unsafe-immutable-hash-...` operations in some cases did not detect and remove the placeholder. Closes #1376 Merge to v6.6 --- pkgs/racket-test-core/tests/racket/unsafe.rktl | 14 ++++++++++++++ racket/src/racket/src/hash.c | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) 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<