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!