on master help sign in
encodeUtf8_1: refactor the last loop body
6dbd7d3Bryan O'Sullivan
Data/Text/Encoding.hs+13−12
@@ -101,7 +101,7 @@ import Data.Text.Encoding.Error (OnDecodeError, UnicodeException, strictDecode)
101import Data.Text.Internal (Text(..), safe, textP)
101import Data.Text.Internal (Text(..), safe, textP)
102import Data.Text.Internal.Private (runText)
102import Data.Text.Internal.Private (runText)
103import Data.Text.Internal.Unsafe.Char (ord, unsafeWrite)
103import Data.Text.Internal.Unsafe.Char (ord, unsafeWrite)
104−import Data.Word (Word8, Word32)
104+import Data.Word (Word8, Word16, Word32)
105import Foreign.C.Types (CSize)
105import Foreign.C.Types (CSize)
106import Foreign.ForeignPtr (ForeignPtr, touchForeignPtr, withForeignPtr)
106import Foreign.ForeignPtr (ForeignPtr, touchForeignPtr, withForeignPtr)
107import Foreign.Marshal.Utils (with)
107import Foreign.Marshal.Utils (with)
@@ -450,6 +450,10 @@ encodeUtf8_1 (Text arr off len)
450 fp' <- resize k m fp
450 fp' <- resize k m fp
451 go n m fp' (unsafeForeignPtrToPtr fp')
451 go n m fp' (unsafeForeignPtrToPtr fp')
452 do1 ptr n m w k = poke8 ptr m w >> k (n+1) (m+1)
452 do1 ptr n m w k = poke8 ptr m w >> k (n+1) (m+1)
453+ loop :: (Word16 -> Int -> Int -> ForeignPtr Word8 -> Ptr Word8
454+ -> (Int -> Int -> IO ByteString)
455+ -> IO ByteString) -> Int -> Int -> ForeignPtr Word8 -> Ptr Word8
456+ -> IO ByteString
453 loop act !n0 !m0 fp ptr = hot n0 m0
457 loop act !n0 !m0 fp ptr = hot n0 m0
454 where hot !n !m
458 where hot !n !m
455 | n == offLen = touchForeignPtr fp >> return (PS fp 0 m)
459 | n == offLen = touchForeignPtr fp >> return (PS fp 0 m)
@@ -478,17 +482,14 @@ encodeUtf8_1 (Text arr off len)
478 poke8 ptr (m+1) $ ((w `shiftR` 6) .&. 0x3F) + 0x80
482 poke8 ptr (m+1) $ ((w `shiftR` 6) .&. 0x3F) + 0x80
479 poke8 ptr (m+2) $ (w .&. 0x3F) + 0x80
483 poke8 ptr (m+2) $ (w .&. 0x3F) + 0x80
480 k (n+1) (m+3)
484 k (n+1) (m+3)
481− go3 !n0 !m0 fp ptr = do
485+ go3 = loop body where body w !n !m fp ptr cont =
482− let hot !n !m
483− | n == offLen = touchForeignPtr fp >> return (PS fp 0 m)
484− | otherwise = do
485− case A.unsafeIndex arr n of
486+ case w of
486− w| w <= 0x7F -> do1 ptr n m w hot
487+ _| w <= 0x7F -> do1 ptr n m w cont
487− | w <= 0x7FF -> do2 ptr n m w hot
488+ | w <= 0x7FF -> do2 ptr n m w cont
488− | w < 0xD800 -> do3 ptr n m w hot
489+ | w < 0xD800 -> do3 ptr n m w cont
489− | w > 0xDBFF -> do3 ptr n m w hot
490+ | w > 0xDBFF -> do3 ptr n m w cont
490− | otherwise -> ensure 4 n m fp go4
491+ | otherwise -> ensure 4 n m fp go4
491− hot n0 m0
492+ {-# INLINE body #-}
492 go4 !n0 !m0 fp ptr = do
493 go4 !n0 !m0 fp ptr = do
493 let hot !n !m
494 let hot !n !m
494 | n == offLen = touchForeignPtr fp >> return (PS fp 0 m)
495 | n == offLen = touchForeignPtr fp >> return (PS fp 0 m)