From e3d8d57fc1a2c0e9f48605c4cd943d10eb6f27b9 Mon Sep 17 00:00:00 2001 From: Oleg Grenrus Date: Fri, 19 Nov 2021 12:02:37 +0200 Subject: [PATCH 1/3] Add reproducer for issue 127 --- parsec.cabal | 7 +++++++ test/issue127.hs | 13 +++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 test/issue127.hs diff --git a/parsec.cabal b/parsec.cabal index d549068..ef5deec 100644 --- a/parsec.cabal +++ b/parsec.cabal @@ -128,3 +128,10 @@ test-suite parsec. ghc-options: -Wcompat -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances else build-depends: semigroups + +test-suite parsec-issue127 + default-language: Haskell2010 + type: exitcode-stdio-1.0 + main-is: issue127.hs + hs-source-dirs: test + build-depends: base, parsec diff --git a/test/issue127.hs b/test/issue127.hs new file mode 100644 index 0000000..2ce827b --- /dev/null +++ b/test/issue127.hs @@ -0,0 +1,13 @@ +module Main (main) where + +import Text.Parsec +import System.Environment (getArgs) +import Control.Monad (replicateM_) + +main :: IO () +main = do + n <- getArgs >>= \args -> return $ case args of + arg : _ -> read arg + _ -> 1000000 + + print $ runParser (replicateM_ n $ return ()) () "test" "" From b00129b5c18be6b2ffba3519761d90bc7ad0764c Mon Sep 17 00:00:00 2001 From: Zubin Duggal Date: Mon, 22 Mar 2021 16:14:32 +0530 Subject: [PATCH 2/3] plug leak in bind --- src/Text/Parsec/Prim.hs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Text/Parsec/Prim.hs b/src/Text/Parsec/Prim.hs index 1dfd7bd..9da4b48 100644 --- a/src/Text/Parsec/Prim.hs +++ b/src/Text/Parsec/Prim.hs @@ -318,7 +318,9 @@ parserBind m k = ParsecT $ \s cok cerr eok eerr -> let -- consumed-okay case for m - mcok x s err = + mcok x s err + | errorIsUnknown err = unParser (k x) s cok cerr cok cerr + | otherwise = let -- if (k x) consumes, those go straigt up pcok = cok @@ -335,7 +337,9 @@ parserBind m k in unParser (k x) s pcok pcerr peok peerr -- empty-ok case for m - meok x s err = + meok x s err + | errorIsUnknown err = unParser (k x) s cok cerr eok eerr + | otherwise = let -- in these cases, (k x) can return as empty pcok = cok From a07385ae6caf037196787dffa81a3bf701655f7f Mon Sep 17 00:00:00 2001 From: Oleg Grenrus Date: Fri, 19 Nov 2021 12:04:08 +0200 Subject: [PATCH 3/3] Add changelog entry --- ChangeLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog.md b/ChangeLog.md index 58e6980..690c717 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -2,6 +2,7 @@ - Add `INLINABLE` pragmas to most overloaded combinators - Support recent versions of dependencies +- Fix memory leak in `>>=` https://github.com/haskell/parsec/issues/127 ### 3.1.14.0