@@ -46,6 +46,7 @@ import Data.Vector as Vector (Vector, empty, fromListN, reverse)
4646import qualified Data.Attoparsec.ByteString as A
4747import qualified Data.Attoparsec.Lazy as L
4848import qualified Data.ByteString as B
49+import qualified Data.ByteString.Unsafe as B
4950import qualified Data.ByteString.Lazy as L
5051import qualified Data.HashMap.Strict as H
5152import qualified Data.Scientific as Sci
@@ -299,6 +300,15 @@ jsonEOF' = json' <* skipSpace <* endOfInput
299300-- A strict pair
300301data SP = SP !Integer {-# UNPACK #-}!Int
301302
303+decimal0 :: Parser Integer
304+decimal0 = do
305+ let step a w = a * 10 + fromIntegral (w - zero)
306+ zero = 48
307+ digits <- A.takeWhile1 isDigit_w8
308+ if B.length digits > 1 && B.unsafeHead digits == zero
309+ then fail "leading zero"
310+ else return (B.foldl' step 0 digits)
311+
302312{-# INLINE scientific #-}
303313scientific :: Parser Scientific
304314scientific = do
@@ -309,7 +319,7 @@ scientific = do
309319 when (sign == plus || sign == minus) $
310320 void A.anyWord8
311321
312− n <- decimal
322+ n <- decimal0
313323
314324 let f fracDigits = SP (B.foldl' step n fracDigits)
315325 (negate $ B.length fracDigits)