diff --git a/ghc/lib/exts/Foreign.lhs b/ghc/lib/exts/Foreign.lhs index 29f5e3be9793703e120ea8eac1f783f37d4595f6..eaf8ef3775423d023814600fe98150d1c01c6ccc 100644 --- a/ghc/lib/exts/Foreign.lhs +++ b/ghc/lib/exts/Foreign.lhs @@ -7,9 +7,12 @@ \begin{code} module Foreign ( - ForeignObj -- abstract, instance of: Eq - , makeForeignObj -- :: Addr{-obj-} -> Addr{-finaliser-} -> IO ForeignObj - , writeForeignObj -- :: ForeignObj -> Addr{-new obj-} -> IO () + ForeignObj -- abstract, instance of: Eq + , makeForeignObj -- :: Addr{-obj-} -> Addr{-finaliser-} -> IO ForeignObj + , writeForeignObj -- :: ForeignObj -> Addr{-new obj-} -> IO () + , foreignObjToAddr -- :: ForeignObj -> IO Addr + -- the coercion from a foreign obj. to an addr. is unsafe, + -- and should not be used unless absolutely necessary. , StablePtr {-a-} -- abstract. , makeStablePtr -- :: a -> IO (StablePtr a) @@ -102,6 +105,12 @@ import Int import PrelIOBase ( IO(..), IOResult(..) ) \end{code} +\begin{code} +foreignObjToAddr :: ForeignObj -> IO Addr +foreignObjToAddr fo = _casm_ `` %r=(StgAddr)%0; '' fo +\end{code} + + \begin{code} indexCharOffForeignObj :: ForeignObj -> Int -> Char indexCharOffForeignObj (ForeignObj fo#) (I# i#) = C# (indexCharOffForeignObj# fo# i#)