Skip to content

Commit 4ccd3cd

Browse files
authored
Merge pull request #178 from natefaubion/fix-stack-safety
Fix stack safety of alt and bind
2 parents c695f6a + 7edd76c commit 4ccd3cd

File tree

2 files changed

+17
-19
lines changed

2 files changed

+17
-19
lines changed

bench/Main.purs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,8 @@ main = do
207207
$ \_ -> runParser string23_1000 $ sepByRec anyChar (char '3')
208208

209209
log "<th><h2>sepBy 10000</h2></th>"
210-
-- sepBy not stack-safe
211-
-- htmlTableWrap "runParser sepBy 10000" $ benchWith 50
212-
-- $ \_ -> runParser string23_10000 $ sepBy anyChar (char '3')
210+
htmlTableWrap "runParser sepBy 10000" $ benchWith 50
211+
$ \_ -> runParser string23_10000 $ sepBy anyChar (char '3')
213212
htmlTableWrap "runParser sepByRec 10000" $ benchWith 50
214213
$ \_ -> runParser string23_10000 $ sepByRec anyChar (char '3')
215214

@@ -226,9 +225,8 @@ main = do
226225
$ \_ -> runParser string23_1000 $ chainrRec anyChar (pure const) 'x'
227226

228227
log "<th><h2>chainr 10000</h2></th>"
229-
-- chainr not stack-safe
230-
-- htmlTableWrap "runParser chainr 10000" $ benchWith 5
231-
-- $ \_ -> runParser string23_10000 $ chainr anyChar (pure const) 'x'
228+
htmlTableWrap "runParser chainr 10000" $ benchWith 5
229+
$ \_ -> runParser string23_10000 $ chainr anyChar (pure const) 'x'
232230
htmlTableWrap "runParser chainrRec 10000" $ benchWith 5
233231
$ \_ -> runParser string23_10000 $ chainrRec anyChar (pure const) 'x'
234232

@@ -243,14 +241,12 @@ main = do
243241
$ \_ -> runParser string23_1000x $ manyTillRec_ anyChar (char 'x')
244242

245243
log "<th><h2>manyTill 10000</h2></th>"
246-
-- manyTill not stack-safe
247-
-- htmlTableWrap "runParser manyTill 10000" $ benchWith 50
248-
-- $ \_ -> runParser string23_10000x $ manyTill anyChar (char 'x')
244+
htmlTableWrap "runParser manyTill 10000" $ benchWith 50
245+
$ \_ -> runParser string23_10000x $ manyTill anyChar (char 'x')
249246
htmlTableWrap "runParser manyTillRec 10000" $ benchWith 50
250247
$ \_ -> runParser string23_10000x $ manyTillRec anyChar (char 'x')
251-
-- manyTill_ not stack-safe
252-
-- htmlTableWrap "runParser manyTill_ 10000" $ benchWith 50
253-
-- $ \_ -> runParser string23_10000x $ manyTill_ anyChar (char 'x')
248+
htmlTableWrap "runParser manyTill_ 10000" $ benchWith 50
249+
$ \_ -> runParser string23_10000x $ manyTill_ anyChar (char 'x')
254250
htmlTableWrap "runParser manyTillRec_ 10000" $ benchWith 50
255251
$ \_ -> runParser string23_10000x $ manyTillRec_ anyChar (char 'x')
256252

src/Parsing.purs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -220,9 +220,10 @@ instance Bind (ParserT s m) where
220220
( mkFn5 \state1 more lift throw done ->
221221
more \_ ->
222222
runFn5 k1 state1 more lift throw
223-
( mkFn2 \state2 a -> do
224-
let (ParserT k2) = next a
225-
runFn5 k2 state2 more lift throw done
223+
( mkFn2 \state2 a ->
224+
more \_ -> do
225+
let (ParserT k2) = next a
226+
runFn5 k2 state2 more lift throw done
226227
)
227228
)
228229

@@ -317,10 +318,11 @@ instance Alt (ParserT s m) where
317318
more \_ ->
318319
runFn5 k1 (ParseState input pos false) more lift
319320
( mkFn2 \state2@(ParseState _ _ consumed) err ->
320-
if consumed then
321-
runFn2 throw state2 err
322-
else
323-
runFn5 k2 state1 more lift throw done
321+
more \_ ->
322+
if consumed then
323+
runFn2 throw state2 err
324+
else
325+
runFn5 k2 state1 more lift throw done
324326
)
325327
done
326328
)

0 commit comments

Comments
 (0)