X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Flib%2Fstd%2FPrelForeign.lhs;fp=ghc%2Flib%2Fstd%2FPrelForeign.lhs;h=f8a4e7b4ef71a40ca78654035b959d914f28f3d0;hb=9c5d0e2276b3a26d863433a300cfa4b7559e82ae;hp=6a78c842a565848722c97d2d7a5246080a53b5c5;hpb=d0e4be1489f3f4bf7c17cddebf23bb45c6291823;p=ghc-hetmet.git diff --git a/ghc/lib/std/PrelForeign.lhs b/ghc/lib/std/PrelForeign.lhs index 6a78c84..f8a4e7b 100644 --- a/ghc/lib/std/PrelForeign.lhs +++ b/ghc/lib/std/PrelForeign.lhs @@ -11,15 +11,9 @@ module PrelForeign ( module PrelForeign, #ifndef __PARALLEL_HASKELL__ ForeignObj(..), + makeForeignObj, #endif - Word(..), - -#ifndef __PARALLEL_HASKELL__ - unpackCStringFO, -- :: ForeignObj -> [Char] - unpackNBytesFO, -- :: ForeignObj -> Int -> [Char] - unpackCStringFO#, -- :: ForeignObj# -> [Char] - unpackNBytesFO# -- :: ForeignObj# -> Int# -> [Char] -#endif + StateAndForeignObj#(..) ) where import PrelIOBase @@ -39,19 +33,22 @@ import PrelGHC \begin{code} #ifndef __PARALLEL_HASKELL__ -instance CCallable ForeignObj -instance CCallable ForeignObj# +--instance CCallable ForeignObj +--instance CCallable ForeignObj# eqForeignObj :: ForeignObj -> ForeignObj -> Bool -makeForeignObj :: Addr -> Addr -> IO ForeignObj +--makeForeignObj :: Addr -> Addr -> IO ForeignObj writeForeignObj :: ForeignObj -> Addr -> IO () {- derived op - attaching a free() finaliser to a malloc() allocated reference. -} makeMallocPtr :: Addr -> IO ForeignObj +{- +--makeForeignObj :: Addr -> Addr -> IO ForeignObj makeForeignObj (A# obj) (A# finaliser) = IO ( \ s# -> case makeForeignObj# obj finaliser s# of StateAndForeignObj# s1# fo# -> IOok s1# (ForeignObj fo#)) +-} writeForeignObj (ForeignObj fo#) (A# datum#) = IO ( \ s# -> case writeForeignObj# fo# datum# s# of { s1# -> IOok s1# () } ) @@ -101,6 +98,14 @@ deRefStablePtr (StablePtr sp#) = IO $ \ rw1# -> freeStablePtr sp = _ccall_ freeStablePointer sp +eqStablePtr :: StablePtr a -> StablePtr b -> Bool +eqStablePtr s1 s2 + = unsafePerformIO (_ccall_ eqStablePtr s1 s2) /= (0::Int) + +instance Eq (StablePtr a) where + p == q = eqStablePtr p q + p /= q = not (eqStablePtr p q) + #endif /* !__PARALLEL_HASKELL__ */ \end{code} @@ -114,48 +119,5 @@ freeStablePtr sp = _ccall_ freeStablePointer sp #ifndef __PARALLEL_HASKELL__ data StateAndStablePtr# s a = StateAndStablePtr# (State# s) (StablePtr# a) #endif -data StateAndForeignObj# s = StateAndForeignObj# (State# s) ForeignObj# -\end{code} - -%********************************************************* -%* * -\subsection{Unpacking Foreigns} -%* * -%********************************************************* - -Primitives for converting Foreigns pointing to external -sequence of bytes into a list of @Char@s (a renamed version -of the code above). - -\begin{code} -#ifndef __PARALLEL_HASKELL__ -unpackCStringFO :: ForeignObj -> [Char] -unpackCStringFO (ForeignObj fo#) = unpackCStringFO# fo# - -unpackCStringFO# :: ForeignObj# -> [Char] -unpackCStringFO# fo {- ptr. to NUL terminated string-} - = unpack 0# - where - unpack nh - | ch `eqChar#` '\0'# = [] - | otherwise = C# ch : unpack (nh +# 1#) - where - ch = indexCharOffForeignObj# fo nh - -unpackNBytesFO :: ForeignObj -> Int -> [Char] -unpackNBytesFO (ForeignObj fo) (I# l) = unpackNBytesFO# fo l - -unpackNBytesFO# :: ForeignObj# -> Int# -> [Char] - -- This one is called by the compiler to unpack literal strings with NULs in them; rare. -unpackNBytesFO# fo len - = unpack 0# - where - unpack i - | i >=# len = [] - | otherwise = C# ch : unpack (i +# 1#) - where - ch = indexCharOffForeignObj# fo i -#endif +--data StateAndForeignObj# s = StateAndForeignObj# (State# s) ForeignObj# \end{code} - -