
Ashley Yakeley
The documentation for FFI in the GHC user's guide seems to be out of date with regard to passing Ptrs across.
1. My reference is http://www.haskell.org/ghc/docs/latest/set/ffi.html (from http://www.haskell.org/ghc/docs/latest/set/book-users-guide.html) Is this the latest documentation available?
2. My understanding is that you can use any instance of 'Storable a => Ptr a' as an FFI argument and return type for both imported and exported functions? Is this correct?
If I understand you question correctly and you want to pass a pointer to C land and back, yes, this is possible.
What if the type is polymorphic (e.g. declared as 'Storable a => Ptr a' rather than something like 'Ptr Word8')?
Also possible, as the argument to `Ptr' is just dummy.
3. What about ForeignPtr? Can instances of 'Storable a => ForeignPtr a' be used in FFI?
They can be passed to C, but you can't get them back. (The storange manager wouldn't know what finaliser to attach.)
4. Does newForeignPtr work safely with null pointers, and will the finalizer get called? For instance:
fp <- newForeignPtr nullPtr finalFunc; let {isNull = (foreignPtrToPtr fp) == nullPtr}; r <- withForeign fp (\p -> foo p);
Will foo be passed nullPtr? Will finalFunc ever get called? Is my use, above, of foreignPtrToPtr safe, and will isNull be True?
Should work. From the storage managers point of view, a `Ptr' is just an uninterpreted bit-pattern. A glorified `Int'. Of course, you should better make sure that `finalFunc' can handle getting a `nullPtr'. Cheers, Manuel