ruby-trunk-changes 2019-12-18

今日は io/console の IO#getch(intr: true) のテストの失敗の対策(途中)やメソッドの再定義時の処理の高速化、メソッドの inline cache の潜在的な不具合修正などがありました。

[299db37957] Kazuhiro NISHIYAMA 2019-12-17 00:46:45 UTC

lib/net/ftp.rb で loop メソッドを使ってたところを while ループを使うようにリファクタリングしています。

[ffa7ceceaf] mihaibuzgau 2019-12-17 10:47:15 UTC

b226a68141bd60db4b14264cb579e3eab9b6bcbd で Gem::Source#initialize 内で uri を遅延ロードしてたのをさらに Gem::SourceList#<< メソッドの中に移動しています。呼び元に引き上げたって感じですね(なんでだろ。require の空振りを減らすためかな)。

[1b86309b04] Nobuyoshi Nakada 2019-12-17 14:38:18 UTC

tool/sync_default_gems.rb で環境変数 FILTER_BRANCH_SQUELCH_WARNING に 1 をセットするようにしています。 これなんの環境変数かなと思ったら git が認識する環境変数のようですね。警告を抑制するためみたいです。

[4b7d27ca0d] Nobuyoshi Nakada 2019-12-17 08:24:21 UTC

拡張ライブラリ io/console のテストで IO#getch を STDIN に対して使っていたのを IO.console を使って端末に紐付いた IO を作って使うように修正しています。

[905a926ea8] Nobuyoshi Nakada 2019-12-17 09:20:37 UTC

拡張ライブラリ io/console のテストで IO#getch の :intr オプションつきの時に標準添付ライブラリ timeout を使ってタイムアウトを設定するようにしてハングアップを防止するようにしています。

[07ed8f2f91] Nobuyoshi Nakada 2019-12-17 14:26:07 UTC

拡張ライブラリ io/console の IO#getch の :intr オプションのテストで intr: true を渡した時に子プロセスで Interrupt が発生するのを確認する assertion をコメントアウトしています。

[bcec03af05] Nobuyoshi Nakada 2019-12-17 15:08:21 UTC

65731a1330ed02691e3c343d2feeb8d0a72af3fd で Travis-CI で io/console の IO#getch の :intr オプションのテストを除外するようにしてたのを revert しています。

[8a40dce0ff] git 2019-12-17 15:08:43 UTC

version.h の日付更新

[d7a50a5cc6] John Hawthorn 2019-12-11 21:10:39 UTC

メソッドの再定義をした時に class_serial を更新するのを継承している子Class や Module に辿って cache 破棄を行なうのに同じ Class/Module に到達する経路が複数あった時に重複して処理していたのを、class_serial が古いやつよりも新しくなっていたら既に辿っていると判定して無駄な traversal をやめるようにしています。賢い。

[8e56d3a6ab] John Hawthorn 2019-12-13 00:42:34 UTC

d7a50a5cc694ab28608a9d5a2e39c2766330ffe6 で古い class_serial を取り出すのに rb_next_class_serial() を一度呼んでしまうという通し番号の無駄遣いをしていたので PREV_CLASS_SERIAL() というマクロを定義して直接現在の ruby_vm_class_serial を取り出すようにしています。

[a01d22b8c1] John Hawthorn 2019-12-11 23:47:49 UTC

vm_method.c の rb_class_clear_method_cache() で RB_TYPE_P() のかわりに BUILTIN_TYPE() と T_CLASS の比較をするようにしています。んー、これってしばらく昔に nobu さんが全体的に RB_TYPE_P() に置き換えてた(そのほうが効率的だからだったっけ)と思うけど、ここでは即値は来ないはずだからってことだそうです。 rb_class_clear_method_cache() かなり頻繁に呼ぶということかな。Rails とかだとそうなのかも。

[9245462499] John Hawthorn 2019-12-13 06:43:00 UTC

rb_class_clear_method_cache() で klass の mtbl が NULL じゃなかった時のデバッグ用の出力や rb_bug() の呼び出しを VM_ASSERT() に置き換えています。最近入れたやつじゃないかなと思ったけどそんなことはなかった。

[254477248c] John Hawthorn 2019-12-12 23:47:59 UTC

Interger#+ などの最適化用 VM 命令の存在するメソッドの再定義による上書きで脱最適化するために Module でメソッドが追加された時にその Module を prepend しているクラスをチェックする check_override_opt_method() で不要な traversal を抑制するために対象のメソッドの ID を保存しておいてチェックが必要なメソッド名でなかったらスキップするようにしています。

[77e3078ede] Nobuyoshi Nakada 2019-12-18 01:25:18 UTC

拡張ライブラリ io/console の IO#raw などで raw mode に設定する関数で struct termios のフラグにセットするビットフラグを変更しています。フロー制御用のビットを落とすようにしたり VMIN/VTIME の設定を追加したりしています。 VMIN/VTIME ってなんだっけ。忘れてしまったけど文字を送出するタイマーとかエスケープ文字を待つ時間とかだったような。VTIME=0 なので文字の送出を滞留させないようにしているようです。

[f054f11a38] 卜部昌平 2019-12-17 06:49:41 UTC

method の inline cache で method entry の更新時に古い rb_method_definition_struct が解放されて同じアドレスに新しい definition がたまたま置かれてしまうと、ポインタでチェックしていると更新が検出できないという問題のため struct rb_method_definition_struct に method_serial というメンバーを追加してこの通し番号でチェックするようにしています。method entry と method definition のライフサイクルがよくわからない。

[c147eeff7c] Nobuyoshi Nakada 2019-12-18 04:29:55 UTC

77e3078ede833e86a1ee0e2ce745b15e892bdbf6 の変更で 07ed8f2f916a512b35bc69b49f1c482a2ea6e9dd でコメントアウトした io/console の IO#getch(intr: true) のテストの assertion を戻してましたが、Linux 上ではやっぱりチェックしないようにしています。なぜか Travis-CI 上でのみ hang up してしまうそうです。

[fcd8bafd08] Nobuyoshi Nakada 2019-12-18 04:35:58 UTC

File.chown のテストでソースディレクトリが読み込み専用のファイルシステムだと失敗するので一時ディレクトリを作成してその下のファイルに対して実行するようにしています。

[dcb603bbdb] 卜部昌平 2019-12-18 03:57:46 UTC

debug_counter.h に fbe229906b6e55c2e7bb1e68452d5c225503b9ca で追加した debug counters の mc_miss_reuse_call についてのドキュメント用コメントを追加しています。

[fa7fa5c86b] 卜部昌平 2019-12-18 04:03:54 UTC

rb_vm_call() という関数がもう使われていなかったので定義を削除しています。

[efbc0d499c] Hiroshi SHIBATA 2019-12-18 05:53:19 UTC

upstream から bundler の 2.1.1 をマージしています。