~ chicken-core (chicken-5) 5ddfa715e50a6bf9c117d7c3bbd17298a6d8061a
commit 5ddfa715e50a6bf9c117d7c3bbd17298a6d8061a
Author: Peter Bex <peter.bex@xs4all.nl>
AuthorDate: Wed Feb 1 21:03:29 2012 +0100
Commit: Peter Bex <peter.bex@xs4all.nl>
CommitDate: Wed Feb 1 21:03:29 2012 +0100
Fix SRFI-69 bug which occurs when string-hash is used as a user-provided procedure
Introduced by a85865154b4f8129f816722eef49fabb8ae8acc1 (hash table "backwards compatibility" fix after the randomization was added)
Reported by Christian Kellermann
diff --git a/srfi-69.scm b/srfi-69.scm
index e55d9eb4..4b22a3cd 100644
--- a/srfi-69.scm
+++ b/srfi-69.scm
@@ -412,11 +412,15 @@
(define (*make-hash-function user-function)
(if (memq user-function (list eq?-hash eqv?-hash equal?-hash hash
string-hash string-hash-ci number-hash))
+ ;; Don't add unneccessary bounds checks for procedures known to be
+ ;; well-behaved (these are not user-*created* functions)
(let ((randomization (##core#inline "C_random_fixnum" most-positive-fixnum)))
- (lambda (object bound)
- ;; Don't add unneccessary bounds checks for procedures known to be
- ;; well-behaved (these are not user-*created* functions)
- (user-function object bound randomization)))
+ (if (memq user-function (list string-hash string-hash-ci))
+ ;; String functions have differing signatures; treat them specially
+ (lambda (object bound)
+ (user-function object bound #f #f randomization))
+ (lambda (object bound)
+ (user-function object bound randomization))))
(lambda (object bound)
(let ((hash (user-function object bound)))
(##sys#check-exact hash 'hash user-function)
diff --git a/tests/hash-table-tests.scm b/tests/hash-table-tests.scm
index 0a04fca5..8ab0913b 100644
--- a/tests/hash-table-tests.scm
+++ b/tests/hash-table-tests.scm
@@ -127,6 +127,14 @@
(assert (list? alist))
(assert (= (length alist) 3)) )
+(print "HT - Built-in string hash function")
+(set! ht (make-hash-table string=?))
+(hash-table-set! ht "test" 123)
+(hash-table-set! ht "one" 1)
+(assert (= 123 (hash-table-ref ht "test")))
+(assert (= 1 (hash-table-ref ht "one")))
+
+
(set! ht (make-hash-table equal? (lambda (object bounds)
(case object
((test) 0)
Trap