-{-# OPTIONS_GHC -XNoImplicitPrelude #-}
+{-# 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.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