final revision to GArrow classes
[ghc-base.git] / Foreign / Marshal.hs
index 61c0008..77a4ebf 100644 (file)
@@ -1,4 +1,5 @@
-{-# OPTIONS -fno-implicit-prelude #-}
+{-# LANGUAGE CPP, NoImplicitPrelude #-}
+
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Foreign.Marshal
 -----------------------------------------------------------------------------
 
 module Foreign.Marshal
-        ( module Foreign.Marshal.Alloc
+        (
+         -- | The module "Foreign.Marshal" re-exports the other modules in the
+         -- @Foreign.Marshal@ hierarchy:
+          module Foreign.Marshal.Alloc
         , module Foreign.Marshal.Array
         , module Foreign.Marshal.Error
+        , module Foreign.Marshal.Pool
         , module Foreign.Marshal.Utils
+         -- | and provides one function:
+        , unsafeLocalState
         ) where
 
 import Foreign.Marshal.Alloc
 import Foreign.Marshal.Array
 import Foreign.Marshal.Error
+import Foreign.Marshal.Pool
 import Foreign.Marshal.Utils
+
+#ifdef __GLASGOW_HASKELL__
+import GHC.IO
+#else
+import System.IO.Unsafe
+#endif
+
+{- |
+Sometimes an external entity is a pure function, except that it passes
+arguments and/or results via pointers.  The function
+@unsafeLocalState@ permits the packaging of such entities as pure
+functions.  
+
+The only IO operations allowed in the IO action passed to
+@unsafeLocalState@ are (a) local allocation (@alloca@, @allocaBytes@
+and derived operations such as @withArray@ and @withCString@), and (b)
+pointer operations (@Foreign.Storable@ and @Foreign.Ptr@) on the
+pointers to local storage, and (c) foreign functions whose only
+observable effect is to read and/or write the locally allocated
+memory.  Passing an IO operation that does not obey these rules
+results in undefined behaviour.
+
+It is expected that this operation will be
+replaced in a future revision of Haskell.
+-}
+unsafeLocalState :: IO a -> a
+unsafeLocalState = unsafePerformIO