From 42c7b2b9d3435b25d4f751777474a4328c49622a Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 23 Jun 2010 07:09:59 -1000 Subject: [PATCH] fix missed parts of the hash-table hahing bug --- collects/tests/racket/basic.rktl | 17 ++++++++++++++++- src/racket/src/hash.c | 16 ++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/collects/tests/racket/basic.rktl b/collects/tests/racket/basic.rktl index 76efb190ab..d8ecb56fb0 100644 --- a/collects/tests/racket/basic.rktl +++ b/collects/tests/racket/basic.rktl @@ -2351,6 +2351,9 @@ (let () (define ht (make-hash)) (define ht2 (make-hash)) + (define wht (make-weak-hash)) + (define wht2 (make-weak-hash)) + (define keys (make-hash)) (struct a (x) #:transparent) @@ -2373,19 +2376,31 @@ i)) (define l2 (shuffle 7 l)) + + (define (reg v) + (hash-set! keys v #t) + v) (for ([i (in-list l)]) (hash-set! ht (a i) (a (a i)))) (for ([i (in-list l2)]) (hash-set! ht2 (a i) (a (a i)))) + (for ([i (in-list l)]) + (hash-set! wht (reg (a i)) (a (a i)))) + (for ([i (in-list l2)]) + (hash-set! wht2 (reg (a i)) (a (a i)))) + (test (equal-hash-code ht) values (equal-hash-code ht2)) + (test (equal-hash-code wht) values (equal-hash-code wht2)) + (test (equal-secondary-hash-code ht) values (equal-secondary-hash-code ht2)) (let ([ht (for/hash ([i (in-list l)]) (values (a i) (a (a i))))] [ht2 (for/hash ([i (in-list l2)]) (values (a i) (a (a i))))]) - (test (equal-hash-code ht) values (equal-hash-code ht2)))) + (test (equal-hash-code ht) values (equal-hash-code ht2)) + (test (equal-secondary-hash-code ht) values (equal-secondary-hash-code ht2)))) ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Misc diff --git a/src/racket/src/hash.c b/src/racket/src/hash.c index 5ca641a4ce..f4d12699cf 100644 --- a/src/racket/src/hash.c +++ b/src/racket/src/hash.c @@ -1261,13 +1261,14 @@ static long equal_hash_key(Scheme_Object *o, long k, Hash_Info *hi) Scheme_Bucket **buckets, *bucket; const char *key; int i, weak; - long vk; + long vk, old_depth; # include "mzhashchk.inc" buckets = ht->buckets; weak = ht->weak; hi->depth += 2; + old_depth = hi->depth; k = (k << 1) + 7; @@ -1285,6 +1286,7 @@ static long equal_hash_key(Scheme_Object *o, long k, Hash_Info *hi) vk += equal_hash_key((Scheme_Object *)key, 0, hi); MZ_MIX(vk); k += vk; /* can't mix k, because the key order shouldn't matter */ + hi->depth = old_depth; /* also needed to avoid order-sensitivity */ } } } @@ -1610,11 +1612,12 @@ static long equal_hash_key2(Scheme_Object *o, Hash_Info *hi) Scheme_Hash_Table *ht = (Scheme_Hash_Table *)o; Scheme_Object **vals, **keys; int i; - long k = 0; + long k = 0, old_depth; # include "mzhashchk.inc" hi->depth += 2; + old_depth = hi->depth; keys = ht->keys; vals = ht->vals; @@ -1622,6 +1625,7 @@ static long equal_hash_key2(Scheme_Object *o, Hash_Info *hi) if (vals[i]) { k += equal_hash_key2(keys[i], hi); k += equal_hash_key2(vals[i], hi); + hi->depth = old_depth; } } @@ -1632,16 +1636,18 @@ static long equal_hash_key2(Scheme_Object *o, Hash_Info *hi) Scheme_Hash_Tree *ht = (Scheme_Hash_Tree *)o; Scheme_Object *iv, *ik; int i; - long k = 0; + long k = 0, old_depth; # include "mzhashchk.inc" hi->depth += 2; + old_depth = hi->depth; for (i = ht->count; i--; ) { scheme_hash_tree_index(ht, i, &ik, &iv); k += equal_hash_key2(ik, hi); k += equal_hash_key2(iv, hi); + hi->depth = old_depth; } return k; @@ -1652,7 +1658,7 @@ static long equal_hash_key2(Scheme_Object *o, Hash_Info *hi) Scheme_Bucket **buckets, *bucket; const char *key; int i, weak; - long k = 0; + long k = 0, old_depth; # include "mzhashchk.inc" @@ -1660,6 +1666,7 @@ static long equal_hash_key2(Scheme_Object *o, Hash_Info *hi) weak = ht->weak; hi->depth += 2; + old_depth = hi->depth; for (i = ht->size; i--; ) { bucket = buckets[i]; @@ -1672,6 +1679,7 @@ static long equal_hash_key2(Scheme_Object *o, Hash_Info *hi) if (key) { k += equal_hash_key2((Scheme_Object *)bucket->val, hi); k += equal_hash_key2((Scheme_Object *)key, hi); + old_depth = hi->depth; } } }