export allocaBytesAligned; make allocaArray use the correct alignment (#2917)
authorSimon Marlow <marlowsd@gmail.com>
Thu, 12 Aug 2010 10:55:24 +0000 (10:55 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Thu, 12 Aug 2010 10:55:24 +0000 (10:55 +0000)
Foreign/Marshal/Alloc.hs
Foreign/Marshal/Array.hs

index 4b35c27..bbc2b98 100644 (file)
@@ -40,6 +40,7 @@ module Foreign.Marshal.Alloc (
   -- ** Local allocation
   alloca,       -- :: Storable a =>        (Ptr a -> IO b) -> IO b
   allocaBytes,  -- ::               Int -> (Ptr a -> IO b) -> IO b
+  allocaBytesAligned,  -- ::        Int -> Int -> (Ptr a -> IO b) -> IO b
 
   -- ** Dynamic allocation
   malloc,       -- :: Storable a =>        IO (Ptr a)
index 8d8da7b..9e8d082 100644 (file)
@@ -63,8 +63,8 @@ module Foreign.Marshal.Array (
 ) where
 
 import Foreign.Ptr      (Ptr, plusPtr)
-import Foreign.Storable (Storable(sizeOf,peekElemOff,pokeElemOff))
-import Foreign.Marshal.Alloc (mallocBytes, allocaBytes, reallocBytes)
+import Foreign.Storable (Storable(alignment,sizeOf,peekElemOff,pokeElemOff))
+import Foreign.Marshal.Alloc (mallocBytes, allocaBytesAligned, reallocBytes)
 import Foreign.Marshal.Utils (copyBytes, moveBytes)
 
 #ifdef __GLASGOW_HASKELL__
@@ -101,7 +101,8 @@ allocaArray :: Storable a => Int -> (Ptr a -> IO b) -> IO b
 allocaArray  = doAlloca undefined
   where
     doAlloca            :: Storable a' => a' -> Int -> (Ptr a' -> IO b') -> IO b'
-    doAlloca dummy size  = allocaBytes (size * sizeOf dummy)
+    doAlloca dummy size  = allocaBytesAligned (size * sizeOf dummy)
+                                              (alignment dummy)
 
 -- |Like 'allocaArray', but add an extra position to hold a special
 -- termination element.