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)