Stefan Israelsson Tampe <[email protected]> writes: > f below in the code is referencing a direct function and not a closure that > is not gc:able it seams > although there is no references to it. It looks like the loaded file > references that code and it will not be > gc:ed until the same file is loaded again (make sure to save the old guardian > so that one can inspect)
This does seem to be the case scheme@(guile−user)> (load "gcbug.scm") ;;; note: source file /tmp/gcbug.scm ;;; newer than compiled /home/ian/.cache/guile/ccache/2.0−LE−4−2.0/tmp/gcbug.scm.go ;;; note: auto−compilation is enabled, set GUILE_AUTO_COMPILE=0 ;;; or pass the −−no−auto−compile argument to disable. ;;; compiling /tmp/gcbug.scm ;;; compiled /home/ian/.cache/guile/ccache/2.0−LE−4−2.0/tmp/gcbug.scm.go #<weak−key−hash−table 1/31> #<weak−key−hash−table 0/31> #f scheme@(guile−user)> guardian $1 = #<guardian 8503710 (reachable: 1 unreachable: 0)> scheme@(guile−user)> (guardian) $2 = #f scheme@(guile−user)> (guardian) $3 = #f scheme@(guile−user)> (define k guardian) scheme@(guile−user)> (load "gcbug.scm") #<weak−key−hash−table 1/31> #<weak−key−hash−table 0/31> #f scheme@(guile−user)> (guardian) $4 = #f scheme@(guile−user)> (guardian) $5 = #f scheme@(guile−user)> (k) $6 = (foo . foo) scheme@(guile−user)> (k) $7 = #f scheme@(guile−user)> here, f is the pair (foo . foo). > The weak key hastable is wrongly used and swaping key and value gives > correct behavior I disagree. While I would certainly expect it to work if I made the reference to f weak, it would miss the point of my code entirely. Namely to make sure that f isn't gc'd until after some other value is (hence the weak reference to a cons, and my comment about expecting to need 2 gcs). FWIW, I swapped it and ran again [ian@Kagami tmp]$ guile -s gcbug.scm ;;; note: source file /tmp/gcbug.scm ;;; newer than compiled /home/ian/.cache/guile/ccache/2.0−LE−4−2.0/tmp/gcbug.scm.go ;;; note: auto−compilation is enabled, set GUILE_AUTO_COMPILE=0 ;;; or pass the −−no−auto−compile argument to disable. ;;; compiling /tmp/gcbug.scm ;;; compiled /home/ian/.cache/guile/ccache/2.0−LE−4−2.0/tmp/gcbug.scm.go #<weak−key−hash−table 1/31> #<weak−key−hash−table 1/31> #f which isn't correct either, but not surprising if something else is holding onto f. -- Ian Price "Programming is like pinball. The reward for doing it well is the opportunity to do it again" - from "The Wizardy Compiled"
