ruby-trunk-changes 2019-10-14

今日は拡張ライブラリ json のいくつかの最適化や標準添付ライブラリ drb の修正や機能強化などがありました。

[26fae9aa9d] Takashi Kokubun 2019-10-13 16:59:43 UTC

MJIT の JIT コンパイルコンパイラを起動する mjit_worker を停止する時に static 変数 mjit_pause_wait_p を使って早期停止を促す処理を消しています。現状だとこれはもう不要になってそうな感じというのと、これから入れようとしている変更がこの処理と相性がよくないらしい。

[673f3842dd] git 2019-10-13 17:05:30 UTC

version.h の日付更新

[183b421509] Takashi Kokubun 2019-10-13 21:11:02 UTC

mjit_worker.c のコンパイル失敗時の struct rb_mjit_unit の解放処理を convert_unit_to_func() の中から呼び元の mjit_worker.c に引き上げています。解放後に unit を触る可能性があったので解放を遅延させるようにしています。

[6fa3492362] Takashi Kokubun 2019-10-14 02:29:46 UTC

さらに 183b42150962e507cd69ceddb64ad2a10f02fdfa に続いて JIT コンパイルした struct rb_mjit_unit を active_units のリストに繋ぐのも convert_unit_to_func() から呼び元の mjit_worker() に引き上げています。リストに繋げた要素が free されてしまうのを避けるためとのこと。

[95c420c4a6] Sutou Kouhei 2019-10-14 03:40:50 UTC

拡張ライブラリ strscan に upstream から 1.0.3 をマージしています。 StringScanner.new の機能追加や不具合修正が含まれているようです。 https://github.com/ruby/ruby/pull/2553

[d0ed935d5b] Jeremy Evans 2019-10-14 05:20:32 UTC

標準添付ライブラリ drb のオブジェクトの同一性チェックや呼んではいけないメソッドの判定などで BasicObject に対応すべく __id__ メソッドや private_methods, protected_methods などのメソッドを UnboundMethod#bind_call を使うようにしたりしています。また同じプロセス内の DRbObject へのメソッドコールで不要な接続をはらないようにする修正など。 https://github.com/ruby/ruby/pull/2552 [ruby-core:26554] [Bug #2339] [ruby-core:28089] [Bug #2718] [ruby-core:52148] [Bug #7833] [ruby-core:85524] [Bug #14471]

[3e763883ea] Nobuyoshi Nakada 2019-10-14 06:10:33 UTC

拡張ライブラリ strscan で onig_region_set() への引数のオーバーフローを考慮してこの関数を使わず構造体の内容を直接セットするようにしています。 onig_region_set() の引数が int なのにもかかわらずセットすべき構造体メンバーが OnigPosition で実質 ptrdiff_t なので関数のインターフェースの設計にミスっている感じ。だけど公開 API なのでさっと直すわけにもいかずという。

[0195966ba2] Nobuyoshi Nakada 2019-10-14 06:42:27 UTC

rubyspec で Thread.exclusive の deprecated 警告が出てたところを抑制するため $VEEBOSE を一時的に nil にするようにしています。

[ede1a3dc11] Kazuhiro NISHIYAMA 2019-10-14 08:30:04 UTC

ccan/list/list.h のコメントの typo 修正。このヘッダは外からもってきたソースコードの一部だと思うけど元から typo してたのかなぁ。

[7376d70cb0] Florian Frank 2019-04-29 13:56:14 UTC

拡張ライブラリ json の parser.rl および生成されるソースコードでの else 節内の if を else の直後に置くスタイル変更です。これ dangling else (はこういうのじゃなかったかも)であんまりいいスタイルじゃないと思うけども…。

[d9e50fcbeb] Sho Hashimoto 2019-01-15 13:16:05 UTC

拡張ライブラリ json で組込みのクラスの to_json メソッド定義する時に引数を as_json の結果の to_json 呼び出しに委譲するようにしています。

[641136c4af] Watson 2018-03-04 14:34:26 UTC

拡張ライブラリ json で文字列が正しい UTF-8エンコードがされているかの確認は文字列全体が ASCII compatible だった時は不要なのでスキップするように最適化しています。

[40724d7d10] Watson 2018-03-01 15:51:30 UTC

拡張ライブラリ json で文字列の Encoding の変換を rb_funcall() で encode メソッドを呼び出していたのを直接 rb_str_encode() を呼ぶように最適化しています。

[d7fa7e2c86] Watson 2018-03-02 16:16:34 UTC

先の 40724d7d10e9902fcdc4149326acbfe4dd95d3c7 で rb_str_encode() を呼び出して UTF-8エンコードしていたのは ASCII incompatible な文字列の時だけにしています。んー、これはいいのかな? 実際のバイト列が ASCII Compatible というのと Encoding が US-ASCII か UTF_8 かというのは別の話ではあると思うけど。実用上は必要なら適宜変換される場合が多くてこれでこけることはあまりないかもしれない。

[2003755a2c] Nobuyoshi Nakada 2019-10-14 10:13:20 UTC

と、思ったら d7fa7e2c860430a3dfa1b08be96734925b6c81d8 の再修正で、rb_enc_str_asciicompat_p() で判定していたのを US-ASCII もしくは UTF-8 であることをチェックするようにしています。これは内容は ASCII compatible なんだけど付与されている Encoding は UTF-8 以外という文字列で変換されなくてエラーになることがあったという修正だそうです。なるほどそっちのほうが問題か。

[a2f9c38a71] Watson 2018-03-01 15:33:18 UTC

標準添付ライブラリ json の Hash をエンコードする時に rb_funcall() で Hash#keys メソッドを呼び出してキーの全リストを取得してからループを回していたのを rb_hash_foreach() を利用してコールバックで逐次エンコードしていくように最適化しています。

[98a9445db9] Watson 2018-03-01 15:45:28 UTC

同じく拡張ライブラリ json の Hash のエンコード時にキーを rb_funcall() で to_s メソッドを呼び出して文字列化していたのを、元々 String オブジェクトだった時と Symbol だった時はメソッド呼び出しを回避するようにしています。 JSON に渡すようなほとんどの場合でメソッド呼び出しを回避できるので結構速くなりそうですね。ベンチマークだと 20%弱くらい速くなってそう。

[308bbb4e10] Sho Hashimoto 2019-01-08 00:12:05 UTC

拡張ライブラリjsonJSON::Ext::Generator::State.new という内部的に使われてるオブジェクトの rdoc 用コメントに ascii_only というキーワード引数について追記しています。

[a4cf11c10f] Florian Frank 2017-12-21 08:57:16 UTC

拡張ライブラリ json のテストで NaN を含んだものを parse するテストはかわりに Infinity を使うようにしています。 NaN 同士の比較は false になるけど、配列の要素として NaN が含まれている時には配列の一部としての要素の比較時にはたまたま同一視されるという挙動に依存していたので。 https://github.com/flori/json/issues/343

[8488d5b5b6] Masatoshi SEKI 2019-10-14 11:30:22 UTC

標準添付ライブラリ drb で remote への接続をはるのを Mutex を使って直接 connection pool を実装していたのを別 Thread を立ててその Thread にリクエストを投げて通信(というかメソッド呼び出し)させるようにしています。主眼は fork した時に Thread が死ぬのでその結果接続が自動的に回収されるというのを狙っているところかなぁ。