2 % (c) The AQUA Project, Glasgow University, 1994-1996
5 \section[Foreign]{Module @Foreign@}
8 {-# OPTIONS -fno-implicit-prelude #-}
12 #ifndef __PARALLEL_HASKELL__
28 %*********************************************************
30 \subsection{Type @ForeignObj@ and its operations}
32 %*********************************************************
35 #ifndef __PARALLEL_HASKELL__
36 --instance CCallable ForeignObj
37 --instance CCallable ForeignObj#
39 makeForeignObj :: Addr -> IO ForeignObj
40 makeForeignObj (A# obj) = IO ( \ s# ->
41 case makeForeignObj# obj s# of
42 (# s1#, fo# #) -> (# s1#, ForeignObj fo# #) )
44 eqForeignObj :: ForeignObj -> ForeignObj -> Bool
45 --makeForeignObj :: Addr -> Addr -> IO ForeignObj
46 writeForeignObj :: ForeignObj -> Addr -> IO ()
48 writeForeignObj (ForeignObj fo#) (A# datum#) = IO ( \ s# ->
49 case writeForeignObj# fo# datum# s# of { s1# -> (# s1#, () #) } )
52 = unsafePerformIO (_ccall_ eqForeignObj mp1 mp2) /= (0::Int)
54 instance Eq ForeignObj where
55 p == q = eqForeignObj p q
56 p /= q = not (eqForeignObj p q)
57 #endif /* !__PARALLEL_HASKELL__ */
60 %*********************************************************
62 \subsection{Type @StablePtr@ and its operations}
64 %*********************************************************
67 #ifndef __PARALLEL_HASKELL__
68 data StablePtr a = StablePtr (StablePtr# a)
69 instance CCallable (StablePtr a)
70 instance CCallable (StablePtr# a)
71 instance CReturnable (StablePtr a)
73 -- Nota Bene: it is important {\em not\/} to inline calls to
74 -- @makeStablePtr#@ since the corresponding macro is very long and we'll
75 -- get terrible code-bloat.
77 makeStablePtr :: a -> IO (StablePtr a)
78 deRefStablePtr :: StablePtr a -> IO a
79 freeStablePtr :: StablePtr a -> IO ()
81 {-# INLINE deRefStablePtr #-}
82 {-# INLINE freeStablePtr #-}
84 makeStablePtr f = IO $ \ rw1# ->
85 case makeStablePtr# f rw1# of
86 (# rw2#, sp# #) -> (# rw2#, StablePtr sp# #)
88 deRefStablePtr (StablePtr sp#) = IO $ \ rw1# ->
89 deRefStablePtr# sp# rw1#
91 freeStablePtr sp = _ccall_ freeStablePointer sp
93 eqStablePtr :: StablePtr a -> StablePtr b -> Bool
94 eqStablePtr (StablePtr sp1#) (StablePtr sp2#) =
95 case eqStablePtr# sp1# sp2# of
99 instance Eq (StablePtr a) where
100 p == q = eqStablePtr p q
101 p /= q = not (eqStablePtr p q)
103 #endif /* !__PARALLEL_HASKELL__ */
106 %*********************************************************
108 \subsection{Unpacking Foreigns}
110 %*********************************************************
112 Primitives for converting Foreigns pointing to external
113 sequence of bytes into a list of @Char@s (a renamed version
117 #ifndef __PARALLEL_HASKELL__
118 unpackCStringFO :: ForeignObj -> [Char]
119 unpackCStringFO (ForeignObj fo#) = unpackCStringFO# fo#
121 unpackCStringFO# :: ForeignObj# -> [Char]
122 unpackCStringFO# fo {- ptr. to NUL terminated string-}
126 | ch `eqChar#` '\0'# = []
127 | otherwise = C# ch : unpack (nh +# 1#)
129 ch = indexCharOffForeignObj# fo nh
131 unpackNBytesFO :: ForeignObj -> Int -> [Char]
132 unpackNBytesFO (ForeignObj fo) (I# l) = unpackNBytesFO# fo l
134 unpackNBytesFO# :: ForeignObj# -> Int# -> [Char]
135 -- This one is called by the compiler to unpack literal strings with NULs in them; rare.
136 unpackNBytesFO# fo len
141 | otherwise = C# ch : unpack (i +# 1#)
143 ch = indexCharOffForeignObj# fo i