1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-18 18:40:22 +02:00

2004-09-01 Han-Wen Nienhuys <hanwen@cs.uu.nl>, Kevin Ryde <user42@zip.com.au>

* tests/gc.test: Exercise record in weak-values hash table, exposing a
	problem in gc.
This commit is contained in:
Kevin Ryde 2004-09-01 01:44:29 +00:00
parent 459cf1f259
commit ef9ab020ae

View file

@ -1,5 +1,5 @@
;;;; gc.test --- test guile's garbage collection -*- scheme -*- ;;;; gc.test --- test guile's garbage collection -*- scheme -*-
;;;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. ;;;; Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc.
;;;; ;;;;
;;;; This program is free software; you can redistribute it and/or modify ;;;; This program is free software; you can redistribute it and/or modify
;;;; it under the terms of the GNU General Public License as published by ;;;; it under the terms of the GNU General Public License as published by
@ -51,6 +51,19 @@
(define (documented? object) (define (documented? object)
(not (not (object-documentation object)))) (not (not (object-documentation object))))
;; In guile 1.6.4 this test bombed, due to the record in h being collected
;; by the gc, but not removed from h, leaving "x" as a freed cell.
;; The usual correct result here is for x to be #f, but there's always a
;; chance gc will mark something used when it isn't, so we allow x to be a
;; record too.
(pass-if "weak-values versus records"
(let ((rec-type (make-record-type "foo" '()))
(h (make-weak-value-hash-table 61)))
(hash-set! h "foo" ((record-constructor rec-type)))
(gc)
(let ((x (hash-ref h "foo")))
(or (not x)
((record-predicate rec-type) x)))))
;;; ;;;
;;; ;;;