From e2c9544ed5a4c608a59219d6bcda6de5ad555758 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 6 Mar 2020 11:15:50 -0700 Subject: [PATCH] bc: fix `hash-set` key replacement for `eq?` values --- pkgs/racket-test-core/tests/racket/hash.rktl | 12 ++++++++++++ racket/src/racket/src/hash.c | 5 +++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/pkgs/racket-test-core/tests/racket/hash.rktl b/pkgs/racket-test-core/tests/racket/hash.rktl index f712b7d8de..83e5b9bcdd 100644 --- a/pkgs/racket-test-core/tests/racket/hash.rktl +++ b/pkgs/racket-test-core/tests/racket/hash.rktl @@ -565,6 +565,18 @@ (check-concurrent-gc-of-keys (lambda (ht proc) (equal-hash-code ht))) +;; ---------------------------------------- +;; Make sure a new `equal?`-based key is used when the "new" value is +;; `eq?` to the old one: + +(let () + (define ht (hash)) + (define f (string-copy "apple")) + (define g (string-copy "apple")) + (define ht2 (hash-set (hash-set ht f 1) g 1)) + (test 1 hash-count ht2) + (test #t eq? (car (hash-keys ht2)) g)) + ;; ---------------------------------------- (report-errs) diff --git a/racket/src/racket/src/hash.c b/racket/src/racket/src/hash.c index e2cd468313..337c1f6912 100644 --- a/racket/src/racket/src/hash.c +++ b/racket/src/racket/src/hash.c @@ -3467,8 +3467,9 @@ Scheme_Hash_Tree *scheme_hash_tree_set_w_key_wraps(Scheme_Hash_Tree *tree, Schem return empty_hash_tree[2]; } else return tree; - } else if (SAME_OBJ(val, mzHAMT_VAL(in_tree, pos))) { - /* Shortcut: setting to the current value */ + } else if (SAME_OBJ(val, mzHAMT_VAL(in_tree, pos)) + && SAME_OBJ(key, in_tree->els[pos])) { + /* Shortcut: setting to the current key and value */ return tree; } else return hamt_set(tree, h, 0, key, val, 0);