From ef9ab020ae4509432f68d88ee99ca5a904439ce7 Mon Sep 17 00:00:00 2001 From: Kevin Ryde Date: Wed, 1 Sep 2004 01:44:29 +0000 Subject: [PATCH] 2004-09-01 Han-Wen Nienhuys , Kevin Ryde * tests/gc.test: Exercise record in weak-values hash table, exposing a problem in gc. --- test-suite/tests/gc.test | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/test-suite/tests/gc.test b/test-suite/tests/gc.test index 2617eff69..3707fe22d 100644 --- a/test-suite/tests/gc.test +++ b/test-suite/tests/gc.test @@ -1,5 +1,5 @@ ;;;; 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 ;;;; it under the terms of the GNU General Public License as published by @@ -51,6 +51,19 @@ (define (documented? 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))))) ;;; ;;;