[Haskell-cafe] Stable pointers: use of cast to/from Ptr
Yves Parès
yves.pares at gmail.com
Sun Feb 12 15:18:44 CET 2012
Hello,
According to the documentation (
http://hackage.haskell.org/packages/archive/base/4.5.0.0/doc/html/Foreign-StablePtr.html),
StablePtrs aims at being opaque on C-side.
But they provide functions to be casted to/from regular *void**'s.
Does that mean if for instance you have a StablePtr CInt you can cast it to Ptr
() and alter it on C-side?
void alter(void* data)
{
int* x = (int*)data;
*x = 42;
}
--------------------------------------------------
-- using 'unsafe' doesn't change anything.
foreign import ccall safe "alter"
alter :: Ptr () -> IO ()
main = do
sptr <- newStablePtr (0 :: CInt)
deRefStablePtr sptr >>= print
alter (castStablePtrToPtr sptr) -- SEGFAULTS!
deRefStablePtr sptr >>= print
freeStablePtr sptr
But I tried it, and it doesn't work: I got a segfault when 'alter' is
called.
Is it normal? Does this mean I can only use my pointer as opaque? (Which I
know to be working, as I already got a C function call back into Haskell
and pass it the StablePtr via a 'foreign export')
But in that case, what is the use of castStablePtrToPtr/castPtrToStablePtr,
as you can already pass StablePtrs to and from C code?
Thanks!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20120212/66b8d516/attachment.htm>
More information about the Haskell-Cafe
mailing list