on master help sign in
Fix name escaping in builders that cross buffer boundaries
1cfe830Evan Czaplicki
compiler/src/Data/Name.hs+9−9
@@ -253,26 +253,26 @@ toEscapedBuilderHelp before after !name@(Name ba#) k =
253 if len <= bLen then
253 if len <= bLen then
254 do -- TODO test if writing word-by-word is faster
254 do -- TODO test if writing word-by-word is faster
255 stToIO (copyToPtr name offset bOffset len)
255 stToIO (copyToPtr name offset bOffset len)
256− stToIO (escape before after bOffset name offset len)
256+ stToIO (escape before after bOffset name offset len 0)
257 let !newBufferRange = B.BufferRange (plusPtr bOffset len) bEnd
257 let !newBufferRange = B.BufferRange (plusPtr bOffset len) bEnd
258 k newBufferRange
258 k newBufferRange
259 else
259 else
260 do stToIO (copyToPtr name offset bOffset bLen)
260 do stToIO (copyToPtr name offset bOffset bLen)
261− stToIO (escape before after bOffset name offset bLen)
261+ stToIO (escape before after bOffset name offset bLen 0)
262 let !newOffset = offset + bLen
262 let !newOffset = offset + bLen
263 let !newLength = len - bLen
263 let !newLength = len - bLen
264 return $ B.bufferFull 1 bEnd (go newOffset newLength)
264 return $ B.bufferFull 1 bEnd (go newOffset newLength)
265
265
266
266
267−escape :: Word8 -> Word8 -> Ptr a -> Name -> Int -> Int -> ST RealWorld ()
267+escape :: Word8 -> Word8 -> Ptr a -> Name -> Int -> Int -> Int -> ST RealWorld ()
268−escape before@(W8# before#) after ptr name@(Name ba#) offset@(I# offset#) end@(I# end#) =
268+escape before@(W8# before#) after ptr name@(Name ba#) offset@(I# offset#) len@(I# len#) i@(I# i#) =
269− if isTrue# (offset# <# end#) then
269+ if isTrue# (i# <# len#) then
270− if isTrue# (eqWord# before# (indexWord8Array# ba# offset#))
270+ if isTrue# (eqWord# before# (indexWord8Array# ba# (offset# +# i#)))
271 then
271 then
272− do writeWordToPtr ptr offset after
272+ do writeWordToPtr ptr i after
273− escape before after ptr name (offset + 1) end
273+ escape before after ptr name offset len (i + 1)
274 else
274 else
275− do escape before after ptr name (offset + 1) end
275+ do escape before after ptr name offset len (i + 1)
276
276
277 else
277 else
278 return ()
278 return ()