Unexpected hashing behavior for records containing locatives pasted by jacius on Fri May 27 05:34:23 2016
;; Even though the filler slots are not used, if you remove any of ;; them, the hash of the instance will change after GC, causing the ;; hash table lookup to fail. (use srfi-69 lolevel) (define table (make-hash-table test: eq? hash: eq?-hash)) (define-record-type box (make-box contents) box? ;; Remove or comment out any of the next three lines: (filler1 box-filler1) (filler2 box-filler2) (filler3 box-filler3) (contents box-contents)) (define my-box (make-box (make-locative "foo"))) (hash-table-set! table my-box #t) (printf "before gc, hash table contains ~S? ~S~N" my-box (hash-table-exists? table my-box)) (gc) (printf "after gc, hash table contains ~S? ~S~N" my-box (hash-table-exists? table my-box)) (printf "hash table as alist: ~S~N" (hash-table->alist table))
Simpler test case added by jacius on Fri May 27 05:42:41 2016
;; Even though the filler slots are not used, if you remove any of ;; them, the hash of the instance will change after GC. But if the ;; filler slots are present, the hash will stay the same after GC. (use srfi-69 lolevel) (define-record-type box (make-box contents) box? ;; Remove or comment out any of the next three lines: (filler1 box-filler1) (filler2 box-filler2) (filler3 box-filler3) (contents box-contents)) (define my-box (make-box (make-locative "foo"))) (define old-hash (eq?-hash my-box)) (gc) (define new-hash (eq?-hash my-box)) (printf "old hash: ~S~N" old-hash) (printf "new hash: ~S~N" new-hash)