@@ -119,8 +119,6 @@ decode UtfTail1 point word = case word of
119
119
w | 0x80 <= w && w <= 0xbf -> (UtfGround , setByte1 point word)
120
120
_ -> throwDecodeError
121
121
122
- {-# INLINE decode #-}
123
-
124
122
decodeHex :: Word8 -> Word16
125
123
decodeHex 48 = 0 -- '0'
126
124
decodeHex 49 = 1 -- '1'
@@ -145,12 +143,12 @@ decodeHex 101 = 14 -- 'e'
145
143
decodeHex 70 = 15 -- 'F'
146
144
decodeHex 102 = 15 -- 'f'
147
145
decodeHex _ = throwDecodeError
148
- {-# INLINE decodeHex #-}
149
146
150
147
unescapeText' :: ByteString -> Text
151
148
unescapeText' bs = runText $ \ done -> do
152
149
dest <- A. new len
153
- (pos, finalState) <- B. foldl' (f' dest) (return (0 , StateNone )) bs
150
+
151
+ (pos, finalState) <- loop dest (0 , StateNone ) 0
154
152
155
153
-- Check final state. Currently pos gets only increased over time, so this check should catch overflows.
156
154
when ( finalState /= StateNone || pos > len)
@@ -172,11 +170,12 @@ unescapeText' bs = runText $ \done -> do
172
170
(st', p) ->
173
171
return (pos, StateUtf st' p)
174
172
175
- {-# INLINE runUtf #-}
176
-
177
- f' dest m c = m >>= \ s -> f dest s c
178
-
179
- {-# INLINE f' #-}
173
+ loop :: A. MArray s -> (Int , State ) -> Int -> ST s (Int , State )
174
+ loop _ ps i | i >= len = return ps
175
+ loop dest ps i = do
176
+ let c = B. index bs i -- JP: We can use unsafe index once we prove bounds with Liquid Haskell.
177
+ ps' <- f dest ps c
178
+ loop dest ps' $ i+ 1
180
179
181
180
-- No pending state.
182
181
f dest (pos, StateNone ) c = runUtf dest pos UtfGround 0 c
@@ -253,8 +252,6 @@ unescapeText' bs = runText $ \done -> do
253
252
else
254
253
writeAndReturn dest pos u StateNone
255
254
256
- {-# INLINE f #-}
257
-
258
255
write :: A. MArray s -> Int -> Word16 -> ST s ()
259
256
write dest pos char =
260
257
A. unsafeWrite dest pos char
@@ -270,8 +267,6 @@ throwDecodeError :: a
270
267
throwDecodeError =
271
268
let desc = " Data.Text.Internal.Encoding.decodeUtf8: Invalid UTF-8 stream" in
272
269
throw (DecodeError desc Nothing )
273
- {-# INLINE throwDecodeError #-}
274
270
275
271
unescapeText :: ByteString -> Either UnicodeException Text
276
272
unescapeText = unsafeDupablePerformIO . try . evaluate . unescapeText'
277
- {-# INLINE unescapeText #-}
0 commit comments