前回の記事はこちら。 先日リリースしたmruby-yyjsonにいくつか機能追加と不具合の修正したv1.2.0をリリースした。 それに伴ってrfで利用しているmruby-yyjsonのバージョンも上げ、v1.21.0にした。
🏕 Features
- Update mruby-yyjson by @buty4649 in https://github.com/buty4649/rf/pull/206
rfの変更は明白なので省略。 ここからはmruby-yyjsonの変更を記載する。
(mruby-yyjson) Floatの値で誤差が出るのを修正した
Ruby上のFloatをC言語のfloatに変換して、yyjson_mut_realでJSONの値に変換するというナイーブな実装にしていたのだが、この実装だと以下のように誤差がでてしまうことがわかった
0.1.to_json #=>0.09999999999999998
原因を詳しく調査していないが型を変換するどこかの処理で誤差が生まれてしまっているのだろうとおもう。 さすがに、これは厳しいので、RubyのFloatをto_sしてそのままJSONの値として書き出すようにした。
0.1.to_json #=> 0.1
(mruby-yyjson) いくつかのメソッドを追加
CRubyのJSONモジュールとの互換性を高めるためにいくつかのメソッドを追加した。
- JSON.[]
- JSON.#dump
- JSON.#fast_generate
- JSON.#load
- JSON.#load_file
ただし完全に互換しているわけではなく、例えばJSON.#loadは引数にprocを取れるわけではないので注意。
(mruby-yyjson) メモリリークを修正
valgrindを使ってメモリリークの検出をしていたら、メモリを開放する前にmrb_raiseを実行してしまっているところを見つけたので修正した。
(mruby-yyjson) JSOn.#generate時の最大ネスト数を実行時に変更できるようにした
v1.0.0ではビルド時の定数で固定値にしていたが、CRubyと同様に引数で指定できるようにした。