~ chicken-core (chicken-5) d6c0b818e308d6cf7878035d21aa3da8282d5c83
commit d6c0b818e308d6cf7878035d21aa3da8282d5c83
Author: Peter Bex <peter.bex@xs4all.nl>
AuthorDate: Tue Aug 28 21:04:30 2012 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Tue Aug 28 21:17:47 2012 +0200
For copy-hash-table, after making a new hash table, reset the hash function to the one of the original table. This fixes #905 (thanks to Mario)
Signed-off-by: felix <felix@call-with-current-continuation.org>
diff --git a/srfi-69.scm b/srfi-69.scm
index d8a22399..9fba35e6 100644
--- a/srfi-69.scm
+++ b/srfi-69.scm
@@ -664,27 +664,30 @@
;; hash-table-copy:
(define *hash-table-copy
- (let ([make-vector make-vector])
+ (let ((make-vector make-vector))
(lambda (ht)
- (let* ([vec1 (##sys#slot ht 1)]
- [len (##sys#size vec1)]
- [vec2 (make-vector len '())]
- [ht2 (do ([i 0 (fx+ i 1)])
- [(fx>= i len)
+ (let* ((vec1 (##sys#slot ht 1))
+ (len (##sys#size vec1))
+ (vec2 (make-vector len '()))
+ (ht2 (do ((i 0 (fx+ i 1)))
+ ((fx>= i len)
(*make-hash-table
(##sys#slot ht 3) (##sys#slot ht 4)
(##sys#slot ht 2)
(##sys#slot ht 5) (##sys#slot ht 6)
(##sys#slot ht 7) (##sys#slot ht 8)
- (##sys#slot ht 9) vec2)]
+ (##sys#slot ht 9) vec2))
(##sys#setslot vec2 i
- (let copy-loop ([bucket (##sys#slot vec1 i)])
+ (let copy-loop ((bucket (##sys#slot vec1 i)))
(if (null? bucket)
'()
- (let ([pare (##sys#slot bucket 0)])
+ (let ((pare (##sys#slot bucket 0)))
(cons (cons (##sys#slot pare 0) (##sys#slot pare 1))
- (copy-loop (##sys#slot bucket 1))))))) )])
+ (copy-loop (##sys#slot bucket 1))))))) )))
+ ;; Size and randomized hashing function are reset by *make-hash-table,
+ ;; so we copy over the ones from the original hash table.
(##sys#setslot ht2 2 (##sys#slot ht 2))
+ (##sys#setslot ht2 10 (##sys#slot ht 10))
ht2 ) ) ) )
(define (hash-table-copy ht)
diff --git a/tests/hash-table-tests.scm b/tests/hash-table-tests.scm
index 91134b16..cd22df07 100644
--- a/tests/hash-table-tests.scm
+++ b/tests/hash-table-tests.scm
@@ -212,4 +212,5 @@
(print l " -- " (hash-table->alist ht2))
(assert (equal? l (sort (hash-table->alist ht2)
(lambda (e1 e2) (< (car e1) (car e2))))))
-
+;; Ensure that lookup still works (#905, randomization value was reset)
+(assert (equal? '(a) (hash-table-ref ht2 1)))
Trap