on master help sign in
Make the length check on unsafeNew mandatory
75fa760Bryan O'Sullivan
Data/Text/Array.hs+8−14
@@ -102,22 +102,16 @@ instance IArray (MArray s) where
102
102
103-- | Create an uninitialized mutable array.
103-- | Create an uninitialized mutable array.
104unsafeNew :: forall s. Int -> ST s (MArray s)
104unsafeNew :: forall s. Int -> ST s (MArray s)
105−unsafeNew n =
105+unsafeNew n
106+ | len < 0 = error $ "Data.Text.Array.unsafeNew: invalid length " ++ show n
107+ | otherwise = ST $ \s1# ->
108+ case newByteArray# len# s1# of
109+ (# s2#, marr# #) -> (# s2#, MArray marr#
106#if defined(ASSERTS)
110#if defined(ASSERTS)
107− assert (n >= 0) .
111+ n
108#endif
112#endif
109− ST $ \s1# ->
113+ #)
110− case bytesInArray n of
111− len@(I# len#) ->
114+ where !len@(I# len#) = bytesInArray n
112−#if defined(ASSERTS)
113− if len < 0 then error (show ("unsafeNew",len)) else
114−#endif
115− case newByteArray# len# s1# of
116− (# s2#, marr# #) -> (# s2#, MArray marr#
117−#if defined(ASSERTS)
118− n
119−#endif
120− #)
121{-# INLINE unsafeNew #-}
115{-# INLINE unsafeNew #-}
122
116
123-- | Freeze a mutable array. Do not mutate the 'MArray' afterwards!
117-- | Freeze a mutable array. Do not mutate the 'MArray' afterwards!