Version française
Home     About     Download     Resources     Contact us    
Browse thread
Re: What exactly can be GC'ed?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Damien Doligez <Damien.Doligez@i...>
Subject: Re: What exactly can be GC'ed?
>From: Ching-Tsun Chou <ctchou@mipos2.intel.com>

># let x = String.make 3 'a' ;;
>val x : string = "aaa"
># let w = Weak.create 1 ;;
>val w : '_a Weak.t = <abstr>
># Weak.set w 0 (Some (x)) ;;
>- : unit = ()
># Weak.get w 0 ;;
>- : string option = Some "aaa"
># let x = "bbb" ;;
>val x : string = "bbb"
># Gc.full_major () ;;
>- : unit = ()
># Weak.get w 0 ;;
>- : string option = Some "aaa"

>It seems to me that since x has been re-bound to "bbb", its old value
>"aaa" is no longer reachable and hence can be GC'ed.  But clearly I
>was wrong.  Where did I go wrong?  What exactly can be GC'ed?

Caml is a language with static binding.  The new definition of x does
not replace the old one in any way, except in the table that maps
names to slots in the table of globals.  When you define the second x,
the first one only loses its name.  It still exists as a global
variable.

Assume that you insert "let f () = x;;" anywhere between the two
bindings of x.  Then the old value is still reachable through f.

The compiler does not recycle globals table entries because it would
add useless complexity to the system (to determine whether an entry is
still in use or not), and it only makes sense under the toplevel
system, which is mostly intended for debugging anyway.

-- Damien