add unsafeLocalState from Haskell 2010, and docs
authorSimon Marlow <marlowsd@gmail.com>
Tue, 20 Jul 2010 08:28:19 +0000 (08:28 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 20 Jul 2010 08:28:19 +0000 (08:28 +0000)
Foreign/Marshal.hs

index 1daf8ef..b815122 100644 (file)
 -----------------------------------------------------------------------------
 
 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 +31,26 @@ import Foreign.Marshal.Array
 import Foreign.Marshal.Error
 import Foreign.Marshal.Pool
 import Foreign.Marshal.Utils
+
+import GHC.IO
+
+{- |
+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