ruby-trunk-changes 2019-11-07

今日は標準添付ライブラリの大量 default gems 化やメソッドの call cache の cache miss の影響を緩和するための最適化などがありました。

[f5c7fc495a] Jun Aruga 2019-11-01 15:27:34 UTC

rubyspec の Process.spawn の :pgroup オプションのテストで Travis-CI の arm64 環境でのテストのための skip を追加しています。

[7750edd1e6] git 2019-11-06 17:09:00 UTC

version.h の日付更新

[212f4d49ba] Takashi Kokubun 2019-11-06 17:10:27 UTC

.travis.yml で arm64-linux をエラーが起きても無視するリストに入れてたのを解除しています。

[a1be11eb12] Takashi Kokubun 2019-11-06 17:52:45 UTC

が、212f4d49bac844b3c0fa52f2185b3df30aa62e75 は revert されています。ブランチでは大丈夫だったんだけど master にマージしたらエラーが起きてしまったと。

[40e161a612] Benoit Daloze 2019-11-06 22:10:15 UTC

rubyspec の Process.clock_getres で指定できる clock の種類の定数で CLOCK_PROCESS_CPUTIME_ID、CLOCK_THREAD_CPUTIME_ID、CLOCK_MONOTONIC_RAW を除外するプラットフォームに armv8 を追加しています。

[91135f6d29] Hiroshi SHIBATA 2019-11-06 02:29:51 UTC

標準添付ライブラリ singleton に gemspec ファイルを追加して default gem 化しています。

[ec2603c353] Hiroshi SHIBATA 2019-11-06 02:33:03 UTC

default gem を upstream から同期するためのツール tool/sync_default_gems.rb でデフォルトの方法ですむやつも一応名前を列挙していましたが、case 文の else にまとめてしまうようにしています。ここからたくさん default gems 化するので。

[fb7fe7f16c] Hiroshi SHIBATA 2019-11-06 13:05:24 UTC

doc/maintainers.rdoc の default gem の標準添付ライブラリのところに rubygems.org の gem の URL を追記しています。

[d1630d41ad] Hiroshi SHIBATA 2019-11-06 13:17:03 UTC

標準添付ライブラリ open3 に gemspec ファイルを追加して default gem 化しています。

[bd2b314a05] John Hawthorn 2019-11-01 00:21:01 UTC

object_id を単調増加するように採番するっていう変更らしいですが次で即座に revert されているので詳細はみてません。動機はやっぱり GC.compact の関連かなぁと思うけど object_id の実装にこっそり依存してるところ多そうでちょっと難しいんじゃないかなぁ。

[e58814d150] Aaron Patterson 2019-11-06 23:12:28 UTC

ということで bd2b314a05ae9192b3143e1e678a37c370d8a9ce は revert されています。

[d0d743ad45] Aaron Patterson 2019-11-07 00:29:09 UTC

gc.c の rb_update_st_references() は rb_gc_update_tbl_refs() と全く同じ実装だったので削除しています。

[1e620c67af] Kazuki Tsujimoto 2019-11-07 04:20:11 UTC

parse.y のセミコロンが抜けてたところを修正。

[a396bef8d8] Kazuki Tsujimoto 2019-11-07 05:00:59 UTC

pattern match の文法で variable pattern で代入する変数に同じものを複数使うのはエラーにしています。

[478f6e2b34] Hiroshi SHIBATA 2019-11-06 23:43:10 UTC

tool/sync_default_gems.rb に getoptlong の対応を追加し、汎用的な同期処理で upstream のリポジトリに test/ サブディレクトリがない時にも対応するようにしています。

[6797c3e371] Hiroshi SHIBATA 2019-11-06 23:48:45 UTC

ということで getoptlong に gemspec ファイルを追加して default gem 化しています。

[3b0bd34001] Hiroshi SHIBATA 2019-11-07 02:17:12 UTC

標準添付ライブラリ pstore に gemspec ファイルを追加して default gem 化しています。

[1159dbf305] Hiroshi SHIBATA 2019-11-07 04:21:46 UTC

標準添付ライブラリ delegate に gemspec ファイルを追加して default gem 化しています。

[77c94e0dd8] Hiroshi SHIBATA 2019-11-07 04:53:05 UTC

標準添付ライブラリ benchmark に gemspec ファイルを追加して default gem 化しています。

[eb0b13596d] Hiroshi SHIBATA 2019-11-07 06:24:59 UTC

標準添付ライブラリ net/pop に gemspec ファイルを追加して default gem 化しています。

[223d3c460a] Hiroshi SHIBATA 2019-11-07 06:38:40 UTC

標準添付ライブラリ net/smtp に gemspec ファイルを追加して default gem 化しています。

[fc85bdeb77] Hiroshi SHIBATA 2019-11-07 07:34:03 UTC

標準添付ライブラリ cgi に gemspec ファイルを追加して default gem 化しています。

[c916f9600b] Hiroshi SHIBATA 2019-11-07 07:44:38 UTC

223d3c460a25e47577b6414e3ed141e54864c8dd の net/smtp の default gem 化で追加した version.rb ファイルで Net::SMTP を module として宣言してしまっていたので class に修正しています。

[3c252651e1] Hiroshi SHIBATA 2019-11-07 08:09:22 UTC

同様に version.rb で Net::POP と Net::SMTP の継承元を書いていなかったので Net::Protocol を継承するように修正しています。

[d45a013a1a] 卜部昌平 2019-10-07 03:59:57 UTC

メソッド呼び出し時の method entry の inline cache は cache miss して再探索しても結局 cache と同じ method entry になるというケースが多いらしいので、構造体 rb_call_cache のサイズを拡張して class_serial を配列にして古い class_serial も保持しておいて、メインの class_serial でのキャッシュが miss した時に過去の履歴もチェックしてひっかかったらこの class_serial を復活させて rb_call_cache::aux だけクリアしておくようにしています。 vm_search_method_fastpath() で class serial が古いのに戻ることってあるんだっけ…と思ったけど class serial は Class/Module ごとに最後に更新があった時の通し番号だから、対象の Class/Module が変更ないやつだったら戻ることはあるか。けどその場合 call cache の class_serial が一旦新しくなってるということは method entry も変わってるはずなので、どうやって以前の結果を使い回してるんだろう…。
[追記]method cache が完全に外れてて me が変わる時は過去の履歴の class_serial も含めてリセットされるので、履歴とヒットするということは同じ me が有効である場合だけということで大丈夫そうでした。ただ aux のクリアについてはまだ改良の余地がありそうとのこと。詳しくは https://twitter.com/shyouhei/status/1192633862456672257 からのスレッドを参照。

[26843cbcd0] "NARUSE, Yui" 2019-11-07 09:48:51 UTC

numeric.c の flo_cmp() で右辺(y)が整数だった時に rb_integer_float_cmp() に委譲した結果の整数を変換するのに FIX2INT()+INT2FIX() を使ってたのを FIX2LONG()+LONG2FIX() に変更しています。実際には起きそうにないですが(cmp は -1, 0, 1 のいずれかを返しそう) FIX2INT() は int に収まらなかった時に例外を発生させるため余計な処理が作られる可能性があるので。

[6aa80d5583] "NARUSE, Yui" 2019-11-07 09:53:51 UTC

26843cbcd0b97489f98aa123e700c4e893b1da5e の追加修正で、rb_float_{gt,ge,lt,le}() などでも FIX2INT()+INT2FIX() ではなく FIX2LONG()+LONG2FIX() を使うように変更しています。