primitive-atomic 0.1.0.0 → 0.1.0.1
raw patch · 3 files changed
+12/−7 lines, 3 filesdep +primitive-unlifteddep ~primitivePVP ok
version bump matches the API change (PVP)
Dependencies added: primitive-unlifted
Dependency ranges changed: primitive
API changes (from Hackage documentation)
Files
- primitive-atomic.cabal +4/−2
- src/Data/Primitive/Unlifted/Atomic.hs +7/−5
- test/Unit.hs +1/−0
primitive-atomic.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: primitive-atomic-version: 0.1.0.0+version: 0.1.0.1 synopsis: Wrappers for primops around atomic operations homepage: https://github.com/andrewthad/primitive-atomic license: BSD-3-Clause@@ -21,7 +21,8 @@ Data.Primitive.PrimArray.Atomic build-depends: , base >=4.11.1 && <5- , primitive >= 0.6.4+ , primitive >= 0.7 && <0.8+ , primitive-unlifted >= 0.1 && <0.2 hs-source-dirs: src default-language: Haskell2010 ghc-options: -Wall@@ -34,5 +35,6 @@ , base , primitive-atomic , primitive+ , primitive-unlifted ghc-options: -Wall -O2 default-language: Haskell2010
src/Data/Primitive/Unlifted/Atomic.hs view
@@ -8,8 +8,8 @@ ) where import Control.Monad.Primitive (PrimMonad,PrimState,primitive)-import Data.Primitive (MutableUnliftedArray(..),PrimUnlifted)-import Data.Primitive (toArrayArray#,fromArrayArray#)+import Data.Primitive.Unlifted.Array (MutableUnliftedArray(..))+import Data.Primitive.Unlifted.Class (PrimUnlifted,Unlifted,toUnlifted#,fromUnlifted#) import GHC.Exts (Any,MutableArrayArray#,MutableArray#,ArrayArray#,Int(I#)) import GHC.Exts (casArray#,isTrue#,(==#),unsafeCoerce#) @@ -32,9 +32,11 @@ casUnliftedArray (MutableUnliftedArray arr#) (I# i#) old new = -- All of this unsafeCoercing is really nasty business. This will go away -- once https://github.com/ghc-proposals/ghc-proposals/pull/203 happens.+ -- Also, this is unsound if the result is immidiately consumed by+ -- the FFI. primitive $ \s0 ->- let !uold = (unsafeCoerce# :: ArrayArray# -> Any) (toArrayArray# old)- !unew = (unsafeCoerce# :: ArrayArray# -> Any) (toArrayArray# new)+ let !uold = (unsafeCoerce# :: Unlifted a -> Any) (toUnlifted# old)+ !unew = (unsafeCoerce# :: Unlifted a -> Any) (toUnlifted# new) in case casArray# ((unsafeCoerce# :: MutableArrayArray# (PrimState m) -> MutableArray# (PrimState m) Any) arr#) i# uold unew s0 of- (# s1, n, ur #) -> (# s1, (isTrue# (n ==# 0# ),fromArrayArray# ((unsafeCoerce# :: Any -> ArrayArray#) ur)) #)+ (# s1, n, ur #) -> (# s1, (isTrue# (n ==# 0# ),fromUnlifted# ((unsafeCoerce# :: Any -> Unlifted a) ur)) #)
test/Unit.hs view
@@ -1,6 +1,7 @@ {-# language MultiWayIf #-} import Data.Primitive.Unlifted.Atomic+import Data.Primitive.Unlifted.Array import Data.Primitive import Control.Monad (when)