From 84ced1530c362646d42fb1f8ea347703859eedc4 Mon Sep 17 00:00:00 2001 From: Sean Date: Wed, 22 Jul 2015 09:17:12 -0700 Subject: [PATCH] Remove duplicate work from string parser --- Data/Aeson/Parser/Internal.hs | 29 +++++++++++++++-------------- aeson.cabal | 2 +- benchmarks/aeson-benchmarks.cabal | 2 +- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Data/Aeson/Parser/Internal.hs b/Data/Aeson/Parser/Internal.hs index 40b5ea3a4..d60bb421b 100644 --- a/Data/Aeson/Parser/Internal.hs +++ b/Data/Aeson/Parser/Internal.hs @@ -203,21 +203,22 @@ jstring = A.word8 DOUBLE_QUOTE *> jstring_ -- | Parse a string without a leading quote. jstring_ :: Parser Text jstring_ = {-# SCC "jstring_" #-} do - s <- A.scan False $ \s c -> if s then Just False - else if c == DOUBLE_QUOTE - then Nothing - else Just (c == BACKSLASH) - _ <- A.word8 DOUBLE_QUOTE - s1 <- if BACKSLASH `B.elem` s - then case unescape s of - Right r -> return r - Left err -> fail err - else return s - + (s, (_, escaped)) <- A.runScanner (False, False) go + _ <- A.anyWord8 + s1 <- if escaped + then case unescape s of + Right r -> return r + Left err -> fail err + else return s case decodeUtf8' s1 of - Right r -> return r - Left err -> fail $ show err - + Right r -> return r + Left err -> fail $ show err + where go (a, b) c + | a = Just (False, b) + | c == DOUBLE_QUOTE = Nothing + | otherwise = let a' = c == backSlash + in Just (a', a' || b) + where backSlash = BACKSLASH {-# INLINE jstring_ #-} unescape :: ByteString -> Either String ByteString diff --git a/aeson.cabal b/aeson.cabal index 81dd5c539..d7ad05185 100644 --- a/aeson.cabal +++ b/aeson.cabal @@ -84,7 +84,7 @@ library Data.Aeson.Types.Internal build-depends: - attoparsec >= 0.13.0.0, + attoparsec >= 0.13.0.1, base >= 4.5 && < 5, bytestring >= 0.10.4.0, containers, diff --git a/benchmarks/aeson-benchmarks.cabal b/benchmarks/aeson-benchmarks.cabal index 5fb629dc0..a718907a4 100644 --- a/benchmarks/aeson-benchmarks.cabal +++ b/benchmarks/aeson-benchmarks.cabal @@ -32,7 +32,7 @@ library Data.Aeson.Types.Internal build-depends: - attoparsec >= 0.13.0.0, + attoparsec >= 0.13.0.1, base == 4.*, bytestring >= 0.10.4.0, containers,