Small Int and Char closures in GHCi

Simon Marlow marlowsd at gmail.com
Fri Aug 31 14:14:40 CEST 2012


On 30/08/2012 12:29, Joachim Breitner wrote:
> Hi,
>
> I am preparing a talk about the details of how data and programs look in
> memory in Haskell (well, GHC). When explaining the memory consumption of
> a large String, I wanted to show the effect of short-int-replacement
> that happens in
> http://hackage.haskell.org/trac/ghc/browser/rts/sm/Evac.c#L550
>
> I use my ghc-heap-view-package to observe the heap. This programs shows
> the effect:
>
>          import GHC.HeapView
>          import System.Mem
>
>          main = do
>              let hallo = "hallo"
>              mapM_ (\x -> putStrLn $ show x ++ ": " ++ show (asBox x))
>          hallo
>              performGC
>              mapM_ (\x -> putStrLn $ show x ++ ": " ++ show (asBox x))
>          hallo
>
> gives, as expected:
>
> $ ./SmallChar
> 'h': 0x00007f2811e042a8/1
> 'a': 0x00007f2811e08128/1
> 'l': 0x00007f2811e09ef0/1
> 'l': 0x00007f2811e0bcd8/1
> 'o': 0x00007f2811e0db10/1
> 'h': 0x00000000006d9bd0/1
> 'a': 0x00000000006d9b60/1
> 'l': 0x00000000006d9c10/1
> 'l': 0x00000000006d9c10/1
> 'o': 0x00000000006d9c40/1
>
> but in GHCi, it does not work:
>
> $ runhaskell SmallChar.hs
> 'h': 0x00007f5334623d58/1
> 'a': 0x00007f5334626208/1
> 'l': 0x00007f5334627fc0/1
> 'l': 0x00007f5334629dc0/1
> 'o': 0x00007f533462bba8/1
> 'h': 0x00007f533381a1c8/1
> 'a': 0x00007f5333672e30/1
> 'l': 0x00007f533381a408/1
> 'l': 0x00007f533381a6b8/1
> 'o': 0x00007f533389c5d0/1
>
> Note that the GC does evacuate the closures, as the pointers change. Why
> are these not replaced by the static ones here?

Probably because GHCi has a dynamically loaded copy of the base package, 
so the pointer comparisons that the GC is doing do not match the 
dynamically-loaded I# and C# constructors.

Cheers,
	Simon





More information about the Glasgow-haskell-users mailing list