On Mon, 15 Jan 2001, Simon Marlow wrote:
data UnsafeCString withUnsafeCString :: String -> (UnsafeCString -> IO a) -> IO a
where an UnsafeCString is valid only in an argument position of an unsafe foreign import.
Much of the conversion stuff would have to be done in a different way. An additional internal interface to conversions implemented in C (with ByteArrays instead of Ptrs), pointer arithmetic moved from Haskell to C, and in future hard to mix with Handle I/O done on Ptrs. All because there is no safe way to safely get a Ptr to a ByteArray to be used in Haskell.
I still can't think of a good way to do this in general. Perhaps enhancing the garbage collector so that it could "pin" objects - but you've still got the problem of keeping the lifetime of the ByteArray in sync with the Ptr.
Lifetime is not a problem: withByteArray :: ByteArray -> (Ptr a -> IO b) -> IO b (And now we know that the ByteArray type should be parametrized!) This begins looking similarly to ForeignPtr from the outside. -- Marcin 'Qrczak' Kowalczyk