on master help sign in
Fix a backtrack buffer bug in toParserK

We were leaving extraneous data in the backtrack buffer because of wrongly using "splitAt" where we should have used "take". We should leave the backtrack buffer empty in the Done case.

commitcd7869d219f1474fbd6e828474cd73a7cf1fc4e1 authorHarendra Kumar <harendra@composewell.com> dateSat 25 Jul 2020, 16:07 (6 years ago) parentec97cec
1 file changed+51−49
src/Streamly/Internal/Data/Parser/ParserK/Types.hs+51−49
src/Streamly/Internal/Data/Parser/ParserK/Types.hs+51−49
@@ -153,49 +153,51 @@ parse pstep initial extract (Zipper [] backward forward) cont =
153153 r <- pst
154154 pRes <- pstep r x
155155 case pRes of
156− D.Partial 0 pst1 -> return $ Partial (parseCont [] (return pst1))
156+ D.Done n b -> do
157+ assert (n <= length (x:back)) (return ())
158+ let fwd0 = Prelude.take n (x:back)
159+ fwd = Prelude.reverse fwd0
160+ cont (Zipper [] [] fwd) (Done b)
161+ D.Partial 0 pst1 ->
162+ return $ Partial (parseCont [] (return pst1))
157163 D.Partial n pst1 -> do
158164 assert (n <= length (x:back)) (return ())
159− let src0 = Prelude.take n (x:back)
160− src = Prelude.reverse src0
161− goBuf [] src (return pst1)
165+ let fwd0 = Prelude.take n (x:back)
166+ fwd = Prelude.reverse fwd0
167+ goBuf [] fwd (return pst1)
162168 D.Continue 0 pst1 ->
163169 return $ Continue (parseCont (x:back) (return pst1))
164170 D.Continue n pst1 -> do
165171 assert (n <= length (x:back)) (return ())
166− let (src0, buf1) = splitAt n (x:back)
167− src = Prelude.reverse src0
168− goBuf buf1 src (return pst1)
169− D.Done n b -> do
170− assert (n <= length (x:back)) (return ())
171− let (src0, buf1) = splitAt n (x:back)
172− src = Prelude.reverse src0
173− cont (Zipper [] buf1 src) (Done b)
174− D.Error err -> cont (Zipper [] (x:back) []) (Error err)
172+ let (fwd0, bwd) = splitAt n (x:back)
173+ fwd = Prelude.reverse fwd0
174+ goBuf bwd fwd (return pst1)
175+ D.Error err ->
176+ cont (Zipper [] (x:back) []) (Error err)
175177
176178 goBuf back [] !acc = return $ Continue (parseCont back acc)
177179 goBuf back (x:xs) !pst = do
178180 r <- pst
179181 pRes <- pstep r x
180182 case pRes of
183+ D.Done n b -> do
184+ assert (n <= length (x:back)) (return ())
185+ let fwd0 = Prelude.take n (x:back)
186+ fwd = Prelude.reverse fwd0
187+ cont (Zipper [] [] (fwd ++ xs)) (Done b)
181188 D.Partial 0 pst1 ->
182189 goBuf [] xs (return pst1)
183190 D.Partial n pst1 -> do
184191 assert (n <= length (x:back)) (return ())
185− let src0 = Prelude.take n (x:back)
186− src = Prelude.reverse src0
187− goBuf [] (src ++ xs) (return pst1)
192+ let fwd0 = Prelude.take n (x:back)
193+ fwd = Prelude.reverse fwd0
194+ goBuf [] (fwd ++ xs) (return pst1)
188195 D.Continue 0 pst1 -> goBuf (x:back) xs (return pst1)
189196 D.Continue n pst1 -> do
190197 assert (n <= length (x:back)) (return ())
191− let (src0, buf1) = splitAt n (x:back)
192− src = Prelude.reverse src0 ++ xs
193− goBuf buf1 src (return pst1)
194− D.Done n b -> do
195− assert (n <= length (x:back)) (return ())
196− let (src0, buf1) = splitAt n (x:back)
197− src = Prelude.reverse src0 ++ xs
198− cont (Zipper [] buf1 src) (Done b)
198+ let (fwd0, bwd) = splitAt n (x:back)
199+ fwd = Prelude.reverse fwd0
200+ goBuf bwd (fwd ++ xs) (return pst1)
199201 D.Error err -> cont (Zipper [] (x:back) xs) (Error err)
200202
201203-- The case when checkpoints exist
@@ -223,27 +225,27 @@ parse pstep initial extract (Zipper (cp:cps) backward forward) cont =
223225 pRes <- pstep r x
224226 let cnt1 = cnt + 1
225227 case pRes of
226− D.Partial 0 pst1 ->
228+ D.Done n b -> do
229+ assert (n <= length (x:back)) (return ())
230+ let fwd0 = Prelude.take n (x:back)
231+ fwd = Prelude.reverse fwd0
232+ assert (cp + cnt1 - n >= 0) (return ())
233+ cont (Zipper (cp + cnt1 - n : cps) [] fwd) (Done b)
234+ D.Partial 0 pst1 -> do
227235 return $ Partial (parseCont cnt1 [] (return pst1))
228236 D.Partial n pst1 -> do
229237 assert (n <= length (x:back)) (return ())
230− let src0 = Prelude.take n (x:back)
231− src = Prelude.reverse src0
232− goBuf (cnt1 - n) [] src (return pst1)
238+ let fwd0 = Prelude.take n (x:back)
239+ fwd = Prelude.reverse fwd0
240+ goBuf (cnt1 - n) [] fwd (return pst1)
233241 D.Continue 0 pst1 ->
234242 return $ Continue (parseCont cnt1 (x:back) (return pst1))
235243 D.Continue n pst1 -> do
236244 assert (n <= length (x:back)) (return ())
237− let (src0, buf1) = splitAt n (x:back)
238− src = Prelude.reverse src0
245+ let (fwd0, bwd) = splitAt n (x:back)
246+ fwd = Prelude.reverse fwd0
239247 assert (cnt1 - n >= 0) (return ())
240− goBuf (cnt1 - n) buf1 src (return pst1)
241− D.Done n b -> do
242− assert (n <= length (x:back)) (return ())
243− let (src0, buf1) = splitAt n (x:back)
244− src = Prelude.reverse src0
245− assert (cp + cnt1 - n >= 0) (return ())
246− cont (Zipper (cp + cnt1 - n : cps) buf1 src) (Done b)
248+ goBuf (cnt1 - n) bwd fwd (return pst1)
247249 D.Error err ->
248250 cont (Zipper (cp + cnt1 : cps) (x:back) []) (Error err)
249251
@@ -253,26 +255,26 @@ parse pstep initial extract (Zipper (cp:cps) backward forward) cont =
253255 pRes <- pstep r x
254256 let cnt1 = cnt + 1
255257 case pRes of
258+ D.Done n b -> do
259+ assert (n <= length (x:back)) (return ())
260+ let fwd0 = Prelude.take n (x:back)
261+ fwd = Prelude.reverse fwd0
262+ assert (cp + cnt1 - n >= 0) (return ())
263+ cont (Zipper (cp + cnt1 - n : cps) [] (fwd ++ xs)) (Done b)
256264 D.Partial 0 pst1 ->
257265 goBuf cnt1 [] xs (return pst1)
258266 D.Partial n pst1 -> do
259267 assert (n <= length (x:back)) (return ())
260− let src0 = Prelude.take n (x:back)
261− src = Prelude.reverse src0
262− goBuf (cnt1 - n) [] (src ++ xs) (return pst1)
268+ let fwd0 = Prelude.take n (x:back)
269+ fwd = Prelude.reverse fwd0
270+ goBuf (cnt1 - n) [] (fwd ++ xs) (return pst1)
263271 D.Continue 0 pst1 -> goBuf cnt1 (x:back) xs (return pst1)
264272 D.Continue n pst1 -> do
265273 assert (n <= length (x:back)) (return ())
266− let (src0, buf1) = splitAt n (x:back)
267− src = Prelude.reverse src0 ++ xs
274+ let (fwd0, bwd) = splitAt n (x:back)
275+ fwd = Prelude.reverse fwd0 ++ xs
268276 assert (cnt1 - n >= 0) (return ())
269− goBuf (cnt1 - n) buf1 src (return pst1)
270− D.Done n b -> do
271− assert (n <= length (x:back)) (return ())
272− let (src0, buf1) = splitAt n (x:back)
273− src = Prelude.reverse src0 ++ xs
274− assert (cp + cnt1 - n >= 0) (return ())
275− cont (Zipper (cp + cnt1 - n : cps) buf1 src) (Done b)
277+ goBuf (cnt1 - n) bwd fwd (return pst1)
276278 D.Error err ->
277279 cont (Zipper (cp + cnt1 : cps) (x:back) xs) (Error err)
278280