shortbytestring 0.2.0.0 → 0.2.1.0
raw patch · 6 files changed
+43/−14 lines, 6 filesdep ~basedep ~textPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base, text
API changes (from Hackage documentation)
Files
- CHANGELOG.md +4/−0
- lib/Data/ByteString/Short.hs +4/−3
- lib/Data/ByteString/Short/Decode.hs +14/−6
- lib/Data/ByteString/Short/Internal.hs +17/−1
- lib/Data/ByteString/Short/Word16.hs +2/−2
- shortbytestring.cabal +2/−2
CHANGELOG.md view
@@ -1,5 +1,9 @@ # Revision history for shortbytestring +## 0.2.1.0 -- 2021-12-08++* Fix memory soundness issue wrt [#4](https://github.com/hasufell/shortbytestring/issues/4)+ ## 0.2.0.0 -- 2021-10-31 * Fix issues with CWString conversion
lib/Data/ByteString/Short.hs view
@@ -201,7 +201,7 @@ snoc = \sbs c -> let l = BS.length sbs nl = l + 1 in create nl $ \mba -> do- copyByteArray (asBA sbs) 0 mba 0 nl+ copyByteArray (asBA sbs) 0 mba 0 l writeWord8Array mba l c {-# INLINE snoc #-} @@ -209,8 +209,9 @@ -- -- Note: copies the entire byte array cons :: Word8 -> ShortByteString -> ShortByteString-cons c = \sbs -> let l = BS.length sbs + 1- in create l $ \mba -> do+cons c = \sbs -> let l = BS.length sbs+ nl = l + 1+ in create nl $ \mba -> do writeWord8Array mba 0 c copyByteArray (asBA sbs) 0 mba 1 l {-# INLINE cons #-}
lib/Data/ByteString/Short/Decode.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE RankNTypes #-} module Data.ByteString.Short.Decode (decodeUtf16LE, decodeUtf16LEWith, decodeUtf16LE', decodeUtf16LE'', decodeUtf8, decodeUtf8With, decodeUtf8') where@@ -15,9 +16,13 @@ import Data.Text.Internal.Fusion.Size ( maxSize ) import Data.Text.Internal.Unsafe.Char+#if MIN_VERSION_text(2,0,0)+ ( unsafeChr16, unsafeChr8 )+#else ( unsafeChr, unsafeChr8 )-import Data.Text.Internal.Unsafe.Shift- ( shiftL, shiftR )+#endif+import Data.Bits+ ( unsafeShiftL, unsafeShiftR ) import Data.Word ( Word16, Word8 ) @@ -31,6 +36,9 @@ import GHC.IO ( unsafeDupablePerformIO ) +#if !MIN_VERSION_text(2,0,0)+unsafeChr16 = unsafeChr+#endif -- | /O(n)/ Convert a 'ByteString' into a 'Stream Char', using UTF-8 -- encoding.@@ -56,18 +64,18 @@ -- | /O(n)/ Convert a 'ShortByteString' into a 'Stream Char', using little -- endian UTF-16 encoding. streamUtf16LE :: OnDecodeError -> ShortByteString -> Stream Char-streamUtf16LE onErr bs = Stream next 0 (maxSize (l `shiftR` 1))+streamUtf16LE onErr bs = Stream next 0 (maxSize (l `unsafeShiftR` 1)) where l = BS.length bs {-# INLINE next #-} next i | i >= l = Done- | i+1 < l && U16.validate1 x1 = Yield (unsafeChr x1) (i+2)+ | i+1 < l && U16.validate1 x1 = Yield (unsafeChr16 x1) (i+2) | i+3 < l && U16.validate2 x1 x2 = Yield (U16.chr2 x1 x2) (i+4) | otherwise = decodeError "streamUtf16LE" "UTF-16LE" onErr Nothing (i+1) where- x1 = idx i + (idx (i + 1) `shiftL` 8)- x2 = idx (i + 2) + (idx (i + 3) `shiftL` 8)+ x1 = idx i + (idx (i + 1) `unsafeShiftL` 8)+ x2 = idx (i + 2) + (idx (i + 3) `unsafeShiftL` 8) idx = fromIntegral . BS.index bs :: Int -> Word16 {-# INLINE [0] streamUtf16LE #-}
lib/Data/ByteString/Short/Internal.hs view
@@ -268,8 +268,9 @@ case (# indexWord8Array# ba# i#, indexWord8Array# ba# (i# +# 1#) #) of (# lsb#, msb# #) -> W16# ((decodeWord16LE# (# lsb#, msb# #))) +#if !MIN_VERSION_base(4,16,0) -encodeWord16LE# :: Word# -- ^ Word16+encodeWord16LE# :: Word# -- ^ Word16 -> (# Word#, Word# #) -- ^ Word8 (LSB, MSB) encodeWord16LE# x# = (# (x# `and#` int2Word# 0xff#) , ((x# `and#` int2Word# 0xff00#) `shiftRL#` 8#) #)@@ -278,4 +279,19 @@ -> Word# -- ^ Word16 decodeWord16LE# (# lsb#, msb# #) = ((msb# `shiftL#` 8#) `or#` lsb#) +#else +encodeWord16LE# :: Word16# -- ^ Word16+ -> (# Word8#, Word8# #) -- ^ Word8 (LSB, MSB)+encodeWord16LE# x# = (# word16ToWord8# x#+ , word16ToWord8# (x# `uncheckedShiftRLWord16#` 8#) #)+ where+ word16ToWord8# y = wordToWord8# (word16ToWord# y)++decodeWord16LE# :: (# Word8#, Word8# #) -- ^ Word8 (LSB, MSB)+ -> Word16# -- ^ Word16+decodeWord16LE# (# lsb#, msb# #) = ((word8ToWord16# msb# `uncheckedShiftLWord16#` 8#) `orWord16#` word8ToWord16# lsb#)+ where+ word8ToWord16# y = wordToWord16# (word8ToWord# y)++#endif
lib/Data/ByteString/Short/Word16.hs view
@@ -221,7 +221,7 @@ snoc = \(assertEven -> sbs) c -> let l = BS.length sbs nl = l + 2 in create nl $ \mba -> do- copyByteArray (asBA sbs) 0 mba 0 nl+ copyByteArray (asBA sbs) 0 mba 0 l writeWord16Array mba l c {-# INLINE snoc #-} @@ -233,7 +233,7 @@ nl = l + 2 in create nl $ \mba -> do writeWord16Array mba 0 c- copyByteArray (asBA sbs) 0 mba 2 nl+ copyByteArray (asBA sbs) 0 mba 2 l {-# INLINE cons #-} -- | /O(1)/ Extract the last element of a ShortByteString, which must be finite and at least one Word16.
shortbytestring.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: shortbytestring-version: 0.2.0.0+version: 0.2.1.0 license: MIT license-file: LICENSE maintainer: hasufell@posteo.de@@ -40,7 +40,7 @@ , exceptions ^>=0.10 , primitive ^>=0.7 , template-haskell >=2.10 && <2.20- , text >=1.2.3.0 && <1.2.6+ , text >=1.2.3.0 && <2.1 , word16 , word8 ^>=0.1