on master help sign in
encodeUtf8_2: cap the number of wasted bytes at 2x
9cd3f3aBryan O'Sullivan
Data/Text/Encoding.hs+8−1
@@ -531,7 +531,14 @@ encodeUtf8_2 (Text arr off len)
531 with ptr $ \destPtr -> do
531 with ptr $ \destPtr -> do
532 c_encode_utf8 destPtr (A.aBA arr) (fromIntegral off) (fromIntegral len)
532 c_encode_utf8 destPtr (A.aBA arr) (fromIntegral off) (fromIntegral len)
533 newDest <- peek destPtr
533 newDest <- peek destPtr
534− return (PS fp 0 (newDest `minusPtr` ptr))
534+ let utf8len = newDest `minusPtr` ptr
535+ if utf8len >= len `shiftR` 1
536+ then return (PS fp 0 utf8len)
537+ else do
538+ fp' <- mallocByteString utf8len
539+ withForeignPtr fp' $ \ptr' -> do
540+ memcpy ptr' ptr (fromIntegral utf8len)
541+ return (PS fp' 0 utf8len)
535
542
536-- | Decode text from little endian UTF-16 encoding.
543-- | Decode text from little endian UTF-16 encoding.
537decodeUtf16LEWith :: OnDecodeError -> ByteString -> Text
544decodeUtf16LEWith :: OnDecodeError -> ByteString -> Text