Unsafe checks in D.V.Mutable
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Wed, 2 Dec 2009 14:46:15 +0000 (14:46 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Wed, 2 Dec 2009 14:46:15 +0000 (14:46 +0000)
Data/Vector/Mutable.hs

index 25cf2ca..e9d29c7 100644 (file)
@@ -20,6 +20,8 @@ import           Data.Primitive.Array
 import           Control.Monad.Primitive ( PrimMonad )
 import           Control.Monad.ST ( ST )
 
+#include "vector.h"
+
 -- | Mutable boxed vectors keyed on the monad they live in ('IO' or @'ST' s@).
 data MVector m a = MVector {-# UNPACK #-} !Int
                            {-# UNPACK #-} !Int
@@ -30,7 +32,9 @@ type STVector s = MVector (ST s)
 
 instance G.MVectorPure (MVector m) a where
   length (MVector _ n _) = n
-  unsafeSlice (MVector i _ arr) j m = MVector (i+j) m arr
+  unsafeSlice (MVector i n arr) j m
+    = UNSAFE_CHECK(checkSlice) "unsafeSlice" j m n
+    $ MVector (i+j) m arr
 
   {-# INLINE overlaps #-}
   overlaps (MVector i m arr1) (MVector j n arr2)
@@ -42,20 +46,24 @@ instance G.MVectorPure (MVector m) a where
 
 instance PrimMonad m => G.MVector (MVector m) m a where
   {-# INLINE unsafeNew #-}
-  unsafeNew n = do
+  unsafeNew n = UNSAFE_CHECK(checkLength) "unsafeNew" n
+              $ do
                   arr <- newArray n uninitialised
                   return (MVector 0 n arr)
 
   {-# INLINE unsafeNewWith #-}
-  unsafeNewWith n x = do
+  unsafeNewWith n x = UNSAFE_CHECK(checkLength) "unsafeNewWith" n
+                    $ do
                         arr <- newArray n x
                         return (MVector 0 n arr)
 
   {-# INLINE unsafeRead #-}
-  unsafeRead (MVector i _ arr) j = readArray arr (i+j)
+  unsafeRead (MVector i n arr) j = UNSAFE_CHECK(checkIndex) "unsafeRead" j n
+                                 $ readArray arr (i+j)
 
   {-# INLINE unsafeWrite #-}
-  unsafeWrite (MVector i _ arr) j x = writeArray arr (i+j) x
+  unsafeWrite (MVector i n arr) j x = UNSAFE_CHECK(checkIndex) "unsafeWrite" j n
+                                    $ writeArray arr (i+j) x
 
   {-# INLINE clear #-}
   clear v = G.set v uninitialised