primitive 0.6 → 0.6.1.0
raw patch · 7 files changed
+65/−46 lines, 7 filesdep ~basedep ~ghc-primdep ~transformers
Dependency ranges changed: base, ghc-prim, transformers
Files
- Control/Monad/Primitive.hs +2/−0
- Data/Primitive/Internal/Operations.hs +29/−28
- Data/Primitive/Types.hs +8/−2
- cbits/primitive-memops.c +4/−4
- cbits/primitive-memops.h +12/−11
- changelog.md +9/−0
- primitive.cabal +1/−1
Control/Monad/Primitive.hs view
@@ -31,7 +31,9 @@ import GHC.ST ( ST(..) ) import Control.Monad.Trans.Class (lift)+#if !MIN_VERSION_base(4,8,0) import Data.Monoid (Monoid)+#endif import Control.Monad.Trans.Identity ( IdentityT) import Control.Monad.Trans.List ( ListT )
Data/Primitive/Internal/Operations.hs view
@@ -27,63 +27,64 @@ ) where import Data.Primitive.MachDeps (Word64_#, Int64_#)+import Foreign.C.Types import GHC.Prim foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word8"- setWord8Array# :: MutableByteArray# s -> Int# -> Int# -> Word# -> IO ()+ setWord8Array# :: MutableByteArray# s -> CPtrdiff -> CSize -> Word# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word16"- setWord16Array# :: MutableByteArray# s -> Int# -> Int# -> Word# -> IO ()+ setWord16Array# :: MutableByteArray# s -> CPtrdiff -> CSize -> Word# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word32"- setWord32Array# :: MutableByteArray# s -> Int# -> Int# -> Word# -> IO ()+ setWord32Array# :: MutableByteArray# s -> CPtrdiff -> CSize -> Word# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word64"- setWord64Array# :: MutableByteArray# s -> Int# -> Int# -> Word64_# -> IO ()+ setWord64Array# :: MutableByteArray# s -> CPtrdiff -> CSize -> Word64_# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word"- setWordArray# :: MutableByteArray# s -> Int# -> Int# -> Word# -> IO ()+ setWordArray# :: MutableByteArray# s -> CPtrdiff -> CSize -> Word# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word8"- setInt8Array# :: MutableByteArray# s -> Int# -> Int# -> Int# -> IO ()+ setInt8Array# :: MutableByteArray# s -> CPtrdiff -> CSize -> Int# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word16"- setInt16Array# :: MutableByteArray# s -> Int# -> Int# -> Int# -> IO ()+ setInt16Array# :: MutableByteArray# s -> CPtrdiff -> CSize -> Int# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word32"- setInt32Array# :: MutableByteArray# s -> Int# -> Int# -> Int# -> IO ()+ setInt32Array# :: MutableByteArray# s -> CPtrdiff -> CSize -> Int# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word64"- setInt64Array# :: MutableByteArray# s -> Int# -> Int# -> Int64_# -> IO ()+ setInt64Array# :: MutableByteArray# s -> CPtrdiff -> CSize -> Int64_# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word"- setIntArray# :: MutableByteArray# s -> Int# -> Int# -> Int# -> IO ()+ setIntArray# :: MutableByteArray# s -> CPtrdiff -> CSize -> Int# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Ptr"- setAddrArray# :: MutableByteArray# s -> Int# -> Int# -> Addr# -> IO ()+ setAddrArray# :: MutableByteArray# s -> CPtrdiff -> CSize -> Addr# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Float"- setFloatArray# :: MutableByteArray# s -> Int# -> Int# -> Float# -> IO ()+ setFloatArray# :: MutableByteArray# s -> CPtrdiff -> CSize -> Float# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Double"- setDoubleArray# :: MutableByteArray# s -> Int# -> Int# -> Double# -> IO ()+ setDoubleArray# :: MutableByteArray# s -> CPtrdiff -> CSize -> Double# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Char"- setWideCharArray# :: MutableByteArray# s -> Int# -> Int# -> Char# -> IO ()+ setWideCharArray# :: MutableByteArray# s -> CPtrdiff -> CSize -> Char# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word8"- setWord8OffAddr# :: Addr# -> Int# -> Int# -> Word# -> IO ()+ setWord8OffAddr# :: Addr# -> CPtrdiff -> CSize -> Word# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word16"- setWord16OffAddr# :: Addr# -> Int# -> Int# -> Word# -> IO ()+ setWord16OffAddr# :: Addr# -> CPtrdiff -> CSize -> Word# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word32"- setWord32OffAddr# :: Addr# -> Int# -> Int# -> Word# -> IO ()+ setWord32OffAddr# :: Addr# -> CPtrdiff -> CSize -> Word# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word64"- setWord64OffAddr# :: Addr# -> Int# -> Int# -> Word64_# -> IO ()+ setWord64OffAddr# :: Addr# -> CPtrdiff -> CSize -> Word64_# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word"- setWordOffAddr# :: Addr# -> Int# -> Int# -> Word# -> IO ()+ setWordOffAddr# :: Addr# -> CPtrdiff -> CSize -> Word# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word8"- setInt8OffAddr# :: Addr# -> Int# -> Int# -> Int# -> IO ()+ setInt8OffAddr# :: Addr# -> CPtrdiff -> CSize -> Int# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word16"- setInt16OffAddr# :: Addr# -> Int# -> Int# -> Int# -> IO ()+ setInt16OffAddr# :: Addr# -> CPtrdiff -> CSize -> Int# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word32"- setInt32OffAddr# :: Addr# -> Int# -> Int# -> Int# -> IO ()+ setInt32OffAddr# :: Addr# -> CPtrdiff -> CSize -> Int# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word64"- setInt64OffAddr# :: Addr# -> Int# -> Int# -> Int64_# -> IO ()+ setInt64OffAddr# :: Addr# -> CPtrdiff -> CSize -> Int64_# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Word"- setIntOffAddr# :: Addr# -> Int# -> Int# -> Int# -> IO ()+ setIntOffAddr# :: Addr# -> CPtrdiff -> CSize -> Int# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Ptr"- setAddrOffAddr# :: Addr# -> Int# -> Int# -> Addr# -> IO ()+ setAddrOffAddr# :: Addr# -> CPtrdiff -> CSize -> Addr# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Float"- setFloatOffAddr# :: Addr# -> Int# -> Int# -> Float# -> IO ()+ setFloatOffAddr# :: Addr# -> CPtrdiff -> CSize -> Float# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Double"- setDoubleOffAddr# :: Addr# -> Int# -> Int# -> Double# -> IO ()+ setDoubleOffAddr# :: Addr# -> CPtrdiff -> CSize -> Double# -> IO () foreign import ccall unsafe "primitive-memops.h hsprimitive_memset_Char"- setWideCharOffAddr# :: Addr# -> Int# -> Int# -> Char# -> IO ()+ setWideCharOffAddr# :: Addr# -> CPtrdiff -> CSize -> Char# -> IO ()
Data/Primitive/Types.hs view
@@ -113,7 +113,10 @@ { (# s1#, x# #) -> (# s1#, ctr x# #) } \ ; writeByteArray# arr# i# (ctr x#) s# = wr_arr arr# i# x# s# \ ; setByteArray# arr# i# n# (ctr x#) s# \- = case unsafeCoerce# (internal (set_arr arr# i# n# x#)) s# of \+ = let { i = fromIntegral (I# i#) \+ ; n = fromIntegral (I# n#) \+ } in \+ case unsafeCoerce# (internal (set_arr arr# i n x#)) s# of \ { (# s1#, _ #) -> s1# } \ \ ; indexOffAddr# addr# i# = ctr (idx_addr addr# i#) \@@ -121,7 +124,10 @@ { (# s1#, x# #) -> (# s1#, ctr x# #) } \ ; writeOffAddr# addr# i# (ctr x#) s# = wr_addr addr# i# x# s# \ ; setOffAddr# addr# i# n# (ctr x#) s# \- = case unsafeCoerce# (internal (set_addr addr# i# n# x#)) s# of \+ = let { i = fromIntegral (I# i#) \+ ; n = fromIntegral (I# n#) \+ } in \+ case unsafeCoerce# (internal (set_addr addr# i n x#)) s# of \ { (# s1#, _ #) -> s1# } \ ; {-# INLINE sizeOf# #-} \ ; {-# INLINE alignment# #-} \
cbits/primitive-memops.c view
@@ -1,18 +1,18 @@ #include <string.h> #include "primitive-memops.h" -void hsprimitive_memcpy( void *dst, int doff, void *src, int soff, size_t len )+void hsprimitive_memcpy( void *dst, ptrdiff_t doff, void *src, ptrdiff_t soff, size_t len ) { memcpy( (char *)dst + doff, (char *)src + soff, len ); } -void hsprimitive_memmove( void *dst, int doff, void *src, int soff, size_t len )+void hsprimitive_memmove( void *dst, ptrdiff_t doff, void *src, ptrdiff_t soff, size_t len ) { memmove( (char *)dst + doff, (char *)src + soff, len ); } #define MEMSET(TYPE, ATYPE) \-void hsprimitive_memset_ ## TYPE (Hs ## TYPE *p, int off, int n, ATYPE x) \+void hsprimitive_memset_ ## TYPE (Hs ## TYPE *p, ptrdiff_t off, size_t n, ATYPE x) \ { \ p += off; \ if (x == 0) \@@ -35,7 +35,7 @@ } \ } -void hsprimitive_memset_Word8 (HsWord8 *p, int off, int n, HsWord x)+void hsprimitive_memset_Word8 (HsWord8 *p, ptrdiff_t off, size_t n, HsWord x) { memset( (char *)(p+off), x, n ); }
cbits/primitive-memops.h view
@@ -2,20 +2,21 @@ #define haskell_primitive_memops_h #include <stdlib.h>+#include <stddef.h> #include <HsFFI.h> -void hsprimitive_memcpy( void *dst, int doff, void *src, int soff, size_t len );-void hsprimitive_memmove( void *dst, int doff, void *src, int soff, size_t len );+void hsprimitive_memcpy( void *dst, ptrdiff_t doff, void *src, ptrdiff_t soff, size_t len );+void hsprimitive_memmove( void *dst, ptrdiff_t doff, void *src, ptrdiff_t soff, size_t len ); -void hsprimitive_memset_Word8 (HsWord8 *, int, int, HsWord);-void hsprimitive_memset_Word16 (HsWord16 *, int, int, HsWord);-void hsprimitive_memset_Word32 (HsWord32 *, int, int, HsWord);-void hsprimitive_memset_Word64 (HsWord64 *, int, int, HsWord64);-void hsprimitive_memset_Word (HsWord *, int, int, HsWord);-void hsprimitive_memset_Ptr (HsPtr *, int, int, HsPtr);-void hsprimitive_memset_Float (HsFloat *, int, int, HsFloat);-void hsprimitive_memset_Double (HsDouble *, int, int, HsDouble);-void hsprimitive_memset_Char (HsChar *, int, int, HsChar);+void hsprimitive_memset_Word8 (HsWord8 *, ptrdiff_t, size_t, HsWord);+void hsprimitive_memset_Word16 (HsWord16 *, ptrdiff_t, size_t, HsWord);+void hsprimitive_memset_Word32 (HsWord32 *, ptrdiff_t, size_t, HsWord);+void hsprimitive_memset_Word64 (HsWord64 *, ptrdiff_t, size_t, HsWord64);+void hsprimitive_memset_Word (HsWord *, ptrdiff_t, size_t, HsWord);+void hsprimitive_memset_Ptr (HsPtr *, ptrdiff_t, size_t, HsPtr);+void hsprimitive_memset_Float (HsFloat *, ptrdiff_t, size_t, HsFloat);+void hsprimitive_memset_Double (HsDouble *, ptrdiff_t, size_t, HsDouble);+void hsprimitive_memset_Char (HsChar *, ptrdiff_t, size_t, HsChar); #endif
changelog.md view
@@ -1,3 +1,12 @@+## Changes in version 0.6.1.0++ * Use more appropriate types in internal memset functions, which prevents+ overflows/segfaults on 64-bit systems.++ * Fixed a warning on GHC 7.10++ * Worked around a -dcore-lint bug in GHC 7.6/7.7+ ## Changes in version 0.6 * Split PrimMonad into two classes to allow automatic lifting of primitive
primitive.cabal view
@@ -1,5 +1,5 @@ Name: primitive-Version: 0.6+Version: 0.6.1.0 License: BSD3 License-File: LICENSE