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!