primitive 0.5.1.0 → 0.5.2.1
raw patch · 11 files changed
+98/−46 lines, 11 filesdep ~basedep ~ghc-prim
Dependency ranges changed: base, ghc-prim
Files
- Control/Monad/Primitive.hs +1/−1
- Data/Primitive/Array.hs +1/−1
- Data/Primitive/ByteArray.hs +7/−8
- Data/Primitive/Internal/Compat.hs +1/−1
- Data/Primitive/Internal/Operations.hs +1/−1
- Data/Primitive/MachDeps.hs +1/−1
- Data/Primitive/MutVar.hs +21/−1
- Data/Primitive/Types.hs +5/−6
- cbits/primitive-memops.c +1/−2
- changelog +41/−0
- primitive.cabal +18/−24
Control/Monad/Primitive.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE MagicHash, UnboxedTuples, TypeFamilies #-}+{-# LANGUAGE CPP, MagicHash, UnboxedTuples, TypeFamilies #-} -- | -- Module : Control.Monad.Primitive
Data/Primitive/Array.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE MagicHash, UnboxedTuples, DeriveDataTypeable, BangPatterns #-}+{-# LANGUAGE CPP, MagicHash, UnboxedTuples, DeriveDataTypeable, BangPatterns #-} -- | -- Module : Data.Primitive.Array
Data/Primitive/ByteArray.hs view
@@ -1,5 +1,4 @@-{-# LANGUAGE MagicHash, UnboxedTuples, ForeignFunctionInterface,- UnliftedFFITypes, DeriveDataTypeable #-}+{-# LANGUAGE CPP, MagicHash, UnboxedTuples, UnliftedFFITypes, DeriveDataTypeable #-} -- | -- Module : Data.Primitive.ByteArray@@ -151,8 +150,8 @@ = primitive_ (writeByteArray# arr# i# x) #if __GLASGOW_HASKELL__ >= 702-i# :: Int -> Int#-i# (I# n#) = n#+unI# :: Int -> Int#+unI# (I# n#) = n# #endif -- | Copy a slice of an immutable byte array to a mutable byte array.@@ -167,7 +166,7 @@ {-# INLINE copyByteArray #-} copyByteArray (MutableByteArray dst#) doff (ByteArray src#) soff sz #if __GLASGOW_HASKELL__ >= 702- = primitive_ (copyByteArray# src# (i# soff) dst# (i# doff) (i# sz))+ = primitive_ (copyByteArray# src# (unI# soff) dst# (unI# doff) (unI# sz)) #else = unsafePrimToPrim $ memcpy_ba dst# (fromIntegral doff) src# (fromIntegral soff)@@ -189,7 +188,7 @@ copyMutableByteArray (MutableByteArray dst#) doff (MutableByteArray src#) soff sz #if __GLASGOW_HASKELL__ >= 702- = primitive_ (copyMutableByteArray# src# (i# soff) dst# (i# doff) (i# sz))+ = primitive_ (copyMutableByteArray# src# (unI# soff) dst# (unI# doff) (unI# sz)) #else = unsafePrimToPrim $ memcpy_mba dst# (fromIntegral doff) src# (fromIntegral soff)@@ -237,8 +236,7 @@ {-# INLINE fillByteArray #-} fillByteArray = setByteArray --+#if __GLASGOW_HASKELL__ < 702 foreign import ccall unsafe "primitive-memops.h hsprimitive_memcpy" memcpy_mba :: MutableByteArray# s -> CInt -> MutableByteArray# s -> CInt@@ -248,6 +246,7 @@ memcpy_ba :: MutableByteArray# s -> CInt -> ByteArray# -> CInt -> CSize -> IO ()+#endif foreign import ccall unsafe "primitive-memops.h hsprimitive_memmove" memmove_mba :: MutableByteArray# s -> CInt
Data/Primitive/Internal/Compat.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE MagicHash #-}+{-# LANGUAGE CPP, MagicHash #-} -- | -- Module : Data.Primitive.Internal.Compat
Data/Primitive/Internal/Operations.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE MagicHash, ForeignFunctionInterface, UnliftedFFITypes #-}+{-# LANGUAGE MagicHash, UnliftedFFITypes #-} -- | -- Module : Data.Primitive.Internal.Operations
Data/Primitive/MachDeps.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE MagicHash #-}+{-# LANGUAGE CPP, MagicHash #-} -- | -- Module : Data.Primitive.MachDeps -- Copyright : (c) Roman Leshchinskiy 2009-2012
Data/Primitive/MutVar.hs view
@@ -19,7 +19,9 @@ writeMutVar, atomicModifyMutVar,- modifyMutVar+ atomicModifyMutVar',+ modifyMutVar,+ modifyMutVar' ) where import Control.Monad.Primitive ( PrimMonad(..), primitive_ )@@ -58,9 +60,27 @@ {-# INLINE atomicModifyMutVar #-} atomicModifyMutVar (MutVar mv#) f = primitive $ atomicModifyMutVar# mv# f +-- | Strict version of 'atomicModifyMutVar'. This forces both the value stored+-- in the 'MutVar' as well as the value returned.+atomicModifyMutVar' :: PrimMonad m => MutVar (PrimState m) a -> (a -> (a, b)) -> m b+{-# INLINE atomicModifyMutVar' #-}+atomicModifyMutVar' mv f = do+ b <- atomicModifyMutVar mv force+ b `seq` return b+ where+ force x = let (a, b) = f x in (a, a `seq` b)+ -- | Mutate the contents of a 'MutVar' modifyMutVar :: PrimMonad m => MutVar (PrimState m) a -> (a -> a) -> m () {-# INLINE modifyMutVar #-} modifyMutVar (MutVar mv#) g = primitive_ $ \s# -> case readMutVar# mv# s# of (# s'#, a #) -> writeMutVar# mv# (g a) s'#++-- | Strict version of 'modifyMutVar'+modifyMutVar' :: PrimMonad m => MutVar (PrimState m) a -> (a -> a) -> m ()+{-# INLINE modifyMutVar' #-}+modifyMutVar' (MutVar mv#) g = primitive_ $ \s# ->+ case readMutVar# mv# s# of+ (# s'#, a #) -> let a' = g a in a' `seq` writeMutVar# mv# a' s'#+
Data/Primitive/Types.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE UnboxedTuples, MagicHash, DeriveDataTypeable #-}+{-# LANGUAGE CPP, UnboxedTuples, MagicHash, DeriveDataTypeable #-} -- | -- Module : Data.Primitive.Types@@ -22,7 +22,6 @@ import Data.Primitive.Internal.Operations import GHC.Base (- unsafeCoerce#, Int(..), Char(..), ) import GHC.Float (@@ -114,16 +113,16 @@ { (# 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 internal (set_arr arr# i# n# x#) (unsafeCoerce# s#) of \- { (# s1#, _ #) -> unsafeCoerce# s1# } \+ = case unsafeCoerce# (internal (set_arr arr# i# n# x#)) s# of \+ { (# s1#, _ #) -> s1# } \ \ ; indexOffAddr# addr# i# = ctr (idx_addr addr# i#) \ ; readOffAddr# addr# i# s# = case rd_addr addr# i# s# of \ { (# 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 internal (set_addr addr# i# n# x#) (unsafeCoerce# s#) of \- { (# s1#, _ #) -> unsafeCoerce# s1# } \+ = case unsafeCoerce# (internal (set_addr addr# i# n# x#)) s# of \+ { (# s1#, _ #) -> s1# } \ ; {-# INLINE sizeOf# #-} \ ; {-# INLINE alignment# #-} \ ; {-# INLINE indexByteArray# #-} \
cbits/primitive-memops.c view
@@ -19,7 +19,7 @@ memset(p, 0, n * sizeof(Hs ## TYPE)); \ else if (sizeof(Hs ## TYPE) == sizeof(int)*2) { \ int *q = (int *)p; \- const int *r = (const int *)&x; \+ const int *r = (const int *)(void *)&x; \ while (n>0) { \ q[0] = r[0]; \ q[1] = r[1]; \@@ -49,4 +49,3 @@ MEMSET(Float, HsFloat) MEMSET(Double, HsDouble) MEMSET(Char, HsChar)-
+ changelog view
@@ -0,0 +1,41 @@+Changes in version 0.5.2.0++ * Add strict variants of 'MutVar' modification functions++Changes in version 0.5.1.0++ * Add support for GHC 7.7's new primitive 'Bool' representation++Changes in version 0.5.0.1++ * Disable array copying primitives for GHC 7.6.* and earlier++Changes in version 0.5++ * New in "Data.Primitive.MutVar": 'atomicModifyMutVar'++ * Efficient block fill operations: 'setByteArray', 'setAddr'++Changes in version 0.4.1++ * New module "Data.Primitive.MutVar"++Changes in version 0.4.0.1++ * Critical bug fix in 'fillByteArray'++Changes in version 0.4++ * Support for GHC 7.2 array copying primitives++ * New in "Data.Primitive.ByteArray": 'copyByteArray',+ 'copyMutableByteArray', 'moveByteArray', 'fillByteArray'++ * Deprecated in "Data.Primitive.ByteArray": 'memcpyByteArray',+ 'memcpyByteArray'', 'memmoveByteArray', 'memsetByteArray'++ * New in "Data.Primitive.Array": 'copyArray', 'copyMutableByteArray'++ * New in "Data.Primitive.Addr": 'copyAddr', 'moveAddr'++ * Deprecated in "Data.Primitive.Addr": 'memcpyAddr'
primitive.cabal view
@@ -1,7 +1,8 @@ Name: primitive-Version: 0.5.1.0+Version: 0.5.2.1 License: BSD3 License-File: LICENSE+ Author: Roman Leshchinskiy <rl@cse.unsw.edu.au> Maintainer: Roman Leshchinskiy <rl@cse.unsw.edu.au> Copyright: (c) Roman Leshchinskiy 2009-2012@@ -9,26 +10,18 @@ Bug-Reports: https://github.com/haskell/primitive/issues Category: Data Synopsis: Primitive memory-related operations-Description:- .- This package provides various primitive memory-related operations.- .- Changes in version 0.5.0.1- .- * Disable array copying primitives for GHC 7.6.* and earlier- .- Changes in version 0.5- .- * New in "Data.Primitive.MutVar": @atomicModifyMutVar@- .- * Efficient block fill operations: @setByteArray@, @setAddr@- .--Cabal-Version: >= 1.6+Cabal-Version: >= 1.10 Build-Type: Simple+Description: This package provides various primitive memory-related operations. +Extra-Source-Files: changelog+ Library- Extensions: CPP+ Default-Language: Haskell2010+ Other-Extensions:+ BangPatterns, CPP, DeriveDataTypeable,+ MagicHash, TypeFamilies, UnboxedTuples, UnliftedFFITypes+ Exposed-Modules: Control.Monad.Primitive Data.Primitive@@ -43,18 +36,19 @@ Data.Primitive.Internal.Compat Data.Primitive.Internal.Operations - Build-Depends: base >= 4 && < 5, ghc-prim+ Build-Depends: base >= 4.3 && < 4.8, ghc-prim >= 0.2 && < 0.4 - Ghc-Options: -O2+ Ghc-Options: -O2 -Wall Include-Dirs: cbits Install-Includes: primitive-memops.h includes: primitive-memops.h c-sources: cbits/primitive-memops.c- cc-options: -O3 -ftree-vectorize -fomit-frame-pointer- if arch(i386) || arch(x86_64) {- cc-options: -msse2- }+ cc-options: -O3 -fomit-frame-pointer -Wall+ if !os(solaris)+ cc-options: -ftree-vectorize+ if arch(i386) || arch(x86_64)+ cc-options: -msse2 source-repository head type: git