[implement Foreign.StablePtr
John Meacham <john@repetae.net>**20060427043407] hunk ./lib/base/Foreign/StablePtr.hs 1
--- | Just a dummy skeleton, fixme.
-module Foreign.StablePtr where
+module Foreign.StablePtr(
+    StablePtr(),
+    castStablePtrToPtr,
+    castPtrToStablePtr,
+    newStablePtr,
+    deRefStablePtr,
+    freeStablePtr
+    ) where
+
+import Foreign.Ptr
+
+newtype StablePtr a = StablePtr (Ptr ())
+data PlaceHolder
+
+castPtrToStablePtr :: Ptr () -> StablePtr a
+castPtrToStablePtr p = StablePtr p
+
+castStablePtrToPtr :: StablePtr a -> Ptr ()
+castStablePtrToPtr (StablePtr p) = p
+
+
+freeStablePtr :: StablePtr a -> IO ()
+freeStablePtr _ = return ()
+
+newStablePtr :: a -> IO (StablePtr a)
+newStablePtr x = do
+    ptr <- ref_ptr (unsafeCoerce x)
+    return (StablePtr ptr)
+
+deRefStablePtr :: StablePtr a -> IO a
+deRefStablePtr (StablePtr x) = do
+    v <- deref_ptr x
+    return (unsafeCoerce v)
+
+
+
+foreign import primitive deref_ptr :: Ptr () -> IO PlaceHolder
+foreign import primitive ref_ptr   :: PlaceHolder -> IO (Ptr ())
+
+foreign import primitive unsafeCoerce :: a -> b