1 % ------------------------------------------------------------------------------
2 % $Id: PrelForeign.lhs,v 1.20 2001/07/16 00:39:04 sof Exp $
4 % (c) The University of Glasgow, 1994-2000
7 \section[Foreign]{Module @Foreign@}
10 {-# OPTIONS -fno-implicit-prelude #-}
12 module PrelForeign where
15 import PrelNum -- for fromInteger
20 %*********************************************************
22 \subsection{ForeignPtr}
24 %*********************************************************
27 data ForeignPtr a = ForeignPtr ForeignObj#
28 instance CCallable (ForeignPtr a)
30 eqForeignPtr :: ForeignPtr a -> ForeignPtr a -> Bool
31 eqForeignPtr (ForeignPtr fo1#) (ForeignPtr fo2#) = eqForeignObj# fo1# fo2#
33 instance Eq (ForeignPtr a) where
34 p == q = eqForeignPtr p q
35 p /= q = not (eqForeignPtr p q)
37 newForeignPtr :: Ptr a -> IO () -> IO (ForeignPtr a)
38 newForeignPtr p finalizer
39 = do fObj <- mkForeignPtr p
40 addForeignPtrFinalizer fObj finalizer
43 addForeignPtrFinalizer :: ForeignPtr a -> IO () -> IO ()
44 addForeignPtrFinalizer (ForeignPtr fo) finalizer =
45 IO $ \s -> case mkWeak# fo () finalizer s of { (# s1, w #) -> (# s1, () #) }
47 mkForeignPtr :: Ptr a -> IO (ForeignPtr a) {- not exported -}
48 mkForeignPtr (Ptr obj) = IO ( \ s# ->
49 case mkForeignObj# obj s# of
50 (# s1#, fo# #) -> (# s1#, ForeignPtr fo# #) )
52 touchForeignPtr :: ForeignPtr a -> IO ()
53 touchForeignPtr (ForeignPtr fo)
54 = IO $ \s -> case touch# fo s of s -> (# s, () #)
56 withForeignPtr :: ForeignPtr a -> (Ptr a -> IO b) -> IO b
58 = do r <- io (foreignPtrToPtr fo)
62 foreignPtrToPtr :: ForeignPtr a -> Ptr a
63 foreignPtrToPtr (ForeignPtr fo) = Ptr (foreignObjToAddr# fo)
65 castForeignPtr (ForeignPtr a) = ForeignPtr a