X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Foreign%2FMarshal.hs;h=77a4ebf3cc08f888ba66f74935a22d41a2431fca;hb=8a1129a742003ddacb0fa331309434b5e2953cd8;hp=1daf8ef937911c0b060cbd8d041c6a782937b29f;hpb=10de2c656f74562b662c22928be85e1b3ccda796;p=ghc-base.git diff --git a/Foreign/Marshal.hs b/Foreign/Marshal.hs index 1daf8ef..77a4ebf 100644 --- a/Foreign/Marshal.hs +++ b/Foreign/Marshal.hs @@ -1,4 +1,5 @@ -{-# OPTIONS_GHC -XNoImplicitPrelude #-} +{-# LANGUAGE CPP, NoImplicitPrelude #-} + ----------------------------------------------------------------------------- -- | -- Module : Foreign.Marshal @@ -14,11 +15,16 @@ ----------------------------------------------------------------------------- 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 @@ -26,3 +32,30 @@ 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