fix missed parts of the hash-table hahing bug
This commit is contained in:
parent
ccd13c4862
commit
42c7b2b9d3
|
@ -2351,6 +2351,9 @@
|
||||||
(let ()
|
(let ()
|
||||||
(define ht (make-hash))
|
(define ht (make-hash))
|
||||||
(define ht2 (make-hash))
|
(define ht2 (make-hash))
|
||||||
|
(define wht (make-weak-hash))
|
||||||
|
(define wht2 (make-weak-hash))
|
||||||
|
(define keys (make-hash))
|
||||||
|
|
||||||
(struct a (x) #:transparent)
|
(struct a (x) #:transparent)
|
||||||
|
|
||||||
|
@ -2373,19 +2376,31 @@
|
||||||
i))
|
i))
|
||||||
|
|
||||||
(define l2 (shuffle 7 l))
|
(define l2 (shuffle 7 l))
|
||||||
|
|
||||||
|
(define (reg v)
|
||||||
|
(hash-set! keys v #t)
|
||||||
|
v)
|
||||||
|
|
||||||
(for ([i (in-list l)])
|
(for ([i (in-list l)])
|
||||||
(hash-set! ht (a i) (a (a i))))
|
(hash-set! ht (a i) (a (a i))))
|
||||||
(for ([i (in-list l2)])
|
(for ([i (in-list l2)])
|
||||||
(hash-set! ht2 (a i) (a (a i))))
|
(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 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)])
|
(let ([ht (for/hash ([i (in-list l)])
|
||||||
(values (a i) (a (a i))))]
|
(values (a i) (a (a i))))]
|
||||||
[ht2 (for/hash ([i (in-list l2)])
|
[ht2 (for/hash ([i (in-list l2)])
|
||||||
(values (a i) (a (a i))))])
|
(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
|
;; Misc
|
||||||
|
|
|
@ -1261,13 +1261,14 @@ static long equal_hash_key(Scheme_Object *o, long k, Hash_Info *hi)
|
||||||
Scheme_Bucket **buckets, *bucket;
|
Scheme_Bucket **buckets, *bucket;
|
||||||
const char *key;
|
const char *key;
|
||||||
int i, weak;
|
int i, weak;
|
||||||
long vk;
|
long vk, old_depth;
|
||||||
|
|
||||||
# include "mzhashchk.inc"
|
# include "mzhashchk.inc"
|
||||||
|
|
||||||
buckets = ht->buckets;
|
buckets = ht->buckets;
|
||||||
weak = ht->weak;
|
weak = ht->weak;
|
||||||
hi->depth += 2;
|
hi->depth += 2;
|
||||||
|
old_depth = hi->depth;
|
||||||
|
|
||||||
k = (k << 1) + 7;
|
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);
|
vk += equal_hash_key((Scheme_Object *)key, 0, hi);
|
||||||
MZ_MIX(vk);
|
MZ_MIX(vk);
|
||||||
k += vk; /* can't mix k, because the key order shouldn't matter */
|
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_Hash_Table *ht = (Scheme_Hash_Table *)o;
|
||||||
Scheme_Object **vals, **keys;
|
Scheme_Object **vals, **keys;
|
||||||
int i;
|
int i;
|
||||||
long k = 0;
|
long k = 0, old_depth;
|
||||||
|
|
||||||
# include "mzhashchk.inc"
|
# include "mzhashchk.inc"
|
||||||
|
|
||||||
hi->depth += 2;
|
hi->depth += 2;
|
||||||
|
old_depth = hi->depth;
|
||||||
|
|
||||||
keys = ht->keys;
|
keys = ht->keys;
|
||||||
vals = ht->vals;
|
vals = ht->vals;
|
||||||
|
@ -1622,6 +1625,7 @@ static long equal_hash_key2(Scheme_Object *o, Hash_Info *hi)
|
||||||
if (vals[i]) {
|
if (vals[i]) {
|
||||||
k += equal_hash_key2(keys[i], hi);
|
k += equal_hash_key2(keys[i], hi);
|
||||||
k += equal_hash_key2(vals[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_Hash_Tree *ht = (Scheme_Hash_Tree *)o;
|
||||||
Scheme_Object *iv, *ik;
|
Scheme_Object *iv, *ik;
|
||||||
int i;
|
int i;
|
||||||
long k = 0;
|
long k = 0, old_depth;
|
||||||
|
|
||||||
# include "mzhashchk.inc"
|
# include "mzhashchk.inc"
|
||||||
|
|
||||||
hi->depth += 2;
|
hi->depth += 2;
|
||||||
|
old_depth = hi->depth;
|
||||||
|
|
||||||
for (i = ht->count; i--; ) {
|
for (i = ht->count; i--; ) {
|
||||||
scheme_hash_tree_index(ht, i, &ik, &iv);
|
scheme_hash_tree_index(ht, i, &ik, &iv);
|
||||||
k += equal_hash_key2(ik, hi);
|
k += equal_hash_key2(ik, hi);
|
||||||
k += equal_hash_key2(iv, hi);
|
k += equal_hash_key2(iv, hi);
|
||||||
|
hi->depth = old_depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
return k;
|
return k;
|
||||||
|
@ -1652,7 +1658,7 @@ static long equal_hash_key2(Scheme_Object *o, Hash_Info *hi)
|
||||||
Scheme_Bucket **buckets, *bucket;
|
Scheme_Bucket **buckets, *bucket;
|
||||||
const char *key;
|
const char *key;
|
||||||
int i, weak;
|
int i, weak;
|
||||||
long k = 0;
|
long k = 0, old_depth;
|
||||||
|
|
||||||
# include "mzhashchk.inc"
|
# include "mzhashchk.inc"
|
||||||
|
|
||||||
|
@ -1660,6 +1666,7 @@ static long equal_hash_key2(Scheme_Object *o, Hash_Info *hi)
|
||||||
weak = ht->weak;
|
weak = ht->weak;
|
||||||
|
|
||||||
hi->depth += 2;
|
hi->depth += 2;
|
||||||
|
old_depth = hi->depth;
|
||||||
|
|
||||||
for (i = ht->size; i--; ) {
|
for (i = ht->size; i--; ) {
|
||||||
bucket = buckets[i];
|
bucket = buckets[i];
|
||||||
|
@ -1672,6 +1679,7 @@ static long equal_hash_key2(Scheme_Object *o, Hash_Info *hi)
|
||||||
if (key) {
|
if (key) {
|
||||||
k += equal_hash_key2((Scheme_Object *)bucket->val, hi);
|
k += equal_hash_key2((Scheme_Object *)bucket->val, hi);
|
||||||
k += equal_hash_key2((Scheme_Object *)key, hi);
|
k += equal_hash_key2((Scheme_Object *)key, hi);
|
||||||
|
old_depth = hi->depth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user