Hi Ian, On Apr 1, 2007, at 6:22 PM, Ian Lynagh wrote:
On Sun, Apr 01, 2007 at 06:10:25PM -0400, Gregory Wright wrote:
Ah, remove the #if/#endif around the definition of "puts", its export, and the GHC.Pack import in libraries/base/GHC/Handle.hs
No such luck. I even copied "puts" into libraries/base/GHC/ ForeignPtr.hs but I still get I cycle because I need withCString to define "puts":
Oh, the 6.4.2 definition is different to the 6.6 definition.
Does the 6.6 one work with 6.4.2?:
puts :: String -> IO () puts s = do write_rawBuffer 1 (unsafeCoerce# (packCString# s)) 0 (fromIntegral (length s)) return ()
(packCString# come from GHC.Pack)
Still doesn't work. If I include the definition of write_rawBuffer just above puts (I can't import GHC.Handle because of the dependency loop) and dangerously change CInt to Int in the signature (can't import Foreign.C.Types for the same reason) I still get an error message saying that "fromInteger" is out of scope. This is what I have added to libraries/base/GHC/ForeignPtr.hs: import GHC.List ( null ) import GHC.Base import GHC.IOBase import GHC.List ( length ) import GHC.Pack -- this is new import GHC.Ptr ( Ptr(..) ) import GHC.Err import GHC.Show foreign import ccall unsafe "__hscore_PrelHandle_write" write_rawBuffer :: Int -> RawBuffer -> Int -> Int -> IO Int puts :: String -> IO () puts s = do write_rawBuffer 1 (unsafeCoerce# (packCString# s)) 0 (length s) return () I'm wondering if I should just give up on trying to print anything out from this deep in the libraries and go back to looking at the debugger trace. My guess is still that a FreeBSD libc function is getting called and somehow storing a 32 bit value in a 64 bit location, with junk in the high order word. As always, hints and firm whacks on the side of the head will be appreciated. Best Wishes, Greg