[Haskell-cafe] How can I pass IOUArrays to FFI functions?

Ryan Ingram ryani.spam at gmail.com
Tue Aug 21 02:03:45 EDT 2007


 Thanks to everyone, especially Bulat Ziganshin.

In http://haskell.org/haskellwiki/Modern_array_libraries there is enough
information to do what I want.  It specifically mentions that it's OK to
pass ByteArray# and MutableByteArray# to an "unsafe foreign" procedure as
long as that procedure doesn't save the pointer, and that worked for me.

Here is what I ended up using, which worked great and the FFI usage for a
couple of key functions sped up my code by a large factor:
 import Data.Array.Base
import Data.Array.IO.Internals
import GHC.Exts

{-# INLINE unsafeByteArrayToPtr #-}
unsafeByteArrayToPtr :: IOUArray Int Word32 -> Ptr Word32
unsafeByteArrayToPtr (IOUArray (STUArray _ _ array#)) = Ptr (unsafeCoerce#
array#)

Possibly a better thing to do would be to declare that the call takes a
MutableByteArray# directly in the foreign import statement, which I believe
would let me avoid using unsafeCoerce# at all, but this was good enough for
my purposes.

Afterwards I used -ddump-simpl to check on the generated Core for the
foreign call and it looked good.

  -- ryan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20070820/a1deaa3c/attachment.htm


More information about the Haskell-Cafe mailing list