on master help sign in
Use a better Scientific rendering function
commit3e981194c6620573cbf247ae0a91c62554aacc4a authorMichael Snoyman <michael@snoyman.com> dateFri 23 Aug 2019, 06:40 (7 years ago) parent8087dfc
3 files changed+14−11
yaml/ChangeLog.md+4 yaml/package.yaml+2−2 yaml/src/Data/Yaml.hs+8−9
yaml/ChangeLog.md+4
@@ -1,5 +1,9 @@
11# ChangeLog for yaml
22
3+## 0.11.1.1
4+
5+* Use the appropriate `Scientific` rendering function to avoid a memory overflow when rendering. The previously used function from `aeson` would not use scientific notation, and could use large amounts of memory for values such as `1e9999999999999`.
6+
37## 0.11.1.0
48
59* Better error messages in the `Data.Yaml.Config` module [#168](https://github.com/snoyberg/yaml/issues/168)
yaml/package.yaml+2−2
@@ -1,5 +1,5 @@
11name: yaml
2−version: 0.11.1.0
2+version: 0.11.1.1
33synopsis: Support for parsing and rendering YAML documents.
44description: README and API documentation are available at <https://www.stackage.org/package/yaml>
55category: Data
@@ -46,7 +46,7 @@ dependencies:
4646- vector
4747- text
4848- attoparsec >=0.11.3.0
49−- scientific
49+- scientific >= 0.3 # for Data.ByteString.Builder.Scientific
5050- filepath
5151- directory
5252- template-haskell
yaml/src/Data/Yaml.hs+8−9
@@ -94,22 +94,17 @@ import Data.Aeson
9494 , Object, Array
9595 , withObject, withText, withArray, withScientific, withBool
9696 )
97−#if MIN_VERSION_aeson(1,0,0)
98−import Data.Aeson.Text (encodeToTextBuilder)
99−#else
100−import Data.Aeson.Encode (encodeToTextBuilder)
101−#endif
97+import qualified Data.ByteString.Builder.Scientific
10298import Data.Aeson.Types (Pair, parseMaybe, parseEither, Parser)
10399import Data.ByteString (ByteString)
100+import qualified Data.ByteString.Builder as BB
101+import qualified Data.ByteString.Lazy as BL
104102import Data.Conduit ((.|), runConduitRes)
105103import qualified Data.Conduit.List as CL
106104import qualified Data.HashMap.Strict as M
107105import qualified Data.HashSet as HashSet
108106import Data.Text.Encoding (encodeUtf8)
109107import qualified Data.Text as T
110−import qualified Data.Text.Encoding as TE
111−import qualified Data.Text.Lazy as TL
112−import Data.Text.Lazy.Builder (toLazyText)
113108import qualified Data.Vector as V
114109import System.IO.Unsafe (unsafePerformIO)
115110import Data.Text (Text)
@@ -221,7 +216,11 @@ objToEvents opts o = (:) EventStreamStart
221216 objToEvents' (Bool True) rest = EventScalar "true" BoolTag PlainNoTag Nothing : rest
222217 objToEvents' (Bool False) rest = EventScalar "false" BoolTag PlainNoTag Nothing : rest
223218 -- Use aeson's implementation which gets rid of annoying decimal points
224− objToEvents' n@Number{} rest = EventScalar (TE.encodeUtf8 $ TL.toStrict $ toLazyText $ encodeToTextBuilder n) IntTag PlainNoTag Nothing : rest
219+ objToEvents' (Number s) rest =
220+ let builder = Data.ByteString.Builder.Scientific.scientificBuilder s
221+ lbs = BB.toLazyByteString builder
222+ bs = BL.toStrict lbs
223+ in EventScalar bs IntTag PlainNoTag Nothing : rest
225224
226225 pairToEvents :: Pair -> [Y.Event] -> [Y.Event]
227226 pairToEvents (k, v) = objToEvents' (String k) . objToEvents' v