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#)