From 1034c9be4ee918000b6cce922b7ba5782bbcf010 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 24 Nov 2010 15:44:18 -0700 Subject: [PATCH] fix hashing on C pointers and missing tests --- collects/tests/racket/foreign-test.rktl | 15 +++++++++++++++ src/racket/src/hash.c | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/collects/tests/racket/foreign-test.rktl b/collects/tests/racket/foreign-test.rktl index a8ef509b5c..182edfdea5 100644 --- a/collects/tests/racket/foreign-test.rktl +++ b/collects/tests/racket/foreign-test.rktl @@ -239,6 +239,21 @@ (ptr-set! v _pointer (ptr-add #f 107)) (test 107 ptr-ref v _intptr)) +;; Test equality and hashing of c pointers: +(let ([seventeen1 (cast 17 _long _pointer)] + [seventeen2 (cast 17 _long _pointer)] + [seventeen3 (ptr-add (cast 13 _long _pointer) 4)] + [sixteen (cast 16 _long _pointer)]) + (test #t equal? seventeen1 seventeen2) + (test #t equal? seventeen1 seventeen3) + (test #f equal? sixteen seventeen1) + (test #t = (equal-hash-code seventeen1) (equal-hash-code seventeen2)) + (test #t = (equal-hash-code seventeen1) (equal-hash-code seventeen3)) + (let ([ht (make-hash)]) + (hash-set! ht seventeen1 'hello) + (test 'hello hash-ref ht seventeen2 #f) + (test 'hello hash-ref ht seventeen3 #f))) + (delete-test-files) (report-errs) diff --git a/src/racket/src/hash.c b/src/racket/src/hash.c index b62edbfdfc..b9ac3e4766 100644 --- a/src/racket/src/hash.c +++ b/src/racket/src/hash.c @@ -1080,7 +1080,7 @@ static long equal_hash_key(Scheme_Object *o, long k, Hash_Info *hi) { k = (k << 3) + k; k += (long)((char *)SCHEME_CPTR_VAL(o) + SCHEME_CPTR_OFFSET(o)); - break; + return k; } case scheme_vector_type: case scheme_fxvector_type: