ruby-trunk-changes 2021-11-18

今日は Kernel#load の第2引数に Module を受けつけてその Module 内でスクリプトを評価することができるようにする新機能の追加、callcache まわりの実装のリファクタリングrubygems の Gem::Specification の実装のリファクタリングなどがありました。

[a982a1f1e7] Naohisa Goto 2021-11-17 11:45:02 UTC

template/Makefile.in の DTrace についての Solarisメーリングリストアーカイブへのリンクが書かれているコメントの URL がリンク切れになってたようなので更新しています。

[2d1a7bed03] Koichi Sasada 2021-11-16 08:52:20 UTC

vm_insnhelper.c の vm_call_super_method() で不要な変数への代入を削除し、また rb_bug() の呼び出しを VM_ASSERT() に書きかえています。

[84aba25031] Koichi Sasada 2021-11-16 08:53:33 UTC

vm_callinfo.h の inline 関数 vm_cc_call() に cc->call_ をチェックする VM_ASSERT() を追加しています。

[b2255153cf] Koichi Sasada 2021-11-16 08:57:49 UTC

vm.c に vm_empty_cc_for_super という static 変数を導入して vm_search_super_method で cme が NULL だった時に利用するダミーの? struct rb_callcache を用意して vm_search_super_method() 関数内の static 変数としてポインタを保持して vm_cc_new() で生成して rb_gc_register_mark_object() で mark されるようにしていたのを GC の管理外にあるメモリ領域として扱うようにしています。

[8d7116552d] Koichi Sasada 2021-11-16 09:02:16 UTC

b2255153cf2fe9d7b851c59cc09b358c0630e0a2 の変更で導入した vm_empty_cc_for_super を使う場合以外では struct rb_callcache::cme_ が NULL にならないことを vm_cc_cme() 内で VM_ASSERT() でチェックするようにしています。

[7ec1fc37f4] Koichi Sasada 2021-11-16 09:14:50 UTC

b2255153cf2fe9d7b851c59cc09b358c0630e0a2 で ObjectSpace のヒーブに確保されない struct rb_callcache が作られる時に flags に新たなビットフラグ VM_CALLCACHE_ON_STACK というのを定義してこのビットも立てておくようにしています。 そして rb_iseq_mark() で struct rb_iseq_constant_body からそのような struct rb_callcache が参照されてたら異常終了するように VM_ASSERT() によるチェックを追加しています。

[b95d7d2099] Koichi Sasada 2021-11-16 09:18:45 UTC

b2255153cf2fe9d7b851c59cc09b358c0630e0a2 での vm_empty_cc_for_super の導入によって(たぶん) vm_search_method_fastpath() で vm_cc_cme() の戻り値が NULL かどうかのチェックが不要になったので分岐条件を減らしています。

[c400165afa] Peter Zhu 2021-11-16 20:01:05 UTC

clear_method_cache_by_id_in_class() で mandatory_only_cme が NULL の時にも vm_cme_invalidate() に渡してしまっていたので条件を追加しています。cme->def->iseq_overload が真でも mandatory_only_cme が NULL というのがありえるのかな。

[5a7b4dba26] Yusuke Endoh 2021-11-17 14:38:19 UTC

node.c の dump_node() で char の配列の初期化を要素ごとに代入してたのを文字列リテラルで一括で初期化するように変更しています。

[753cfbdbf3] Yusuke Endoh 2021-11-17 14:38:52 UTC

コマンドラインオプション --dump=parsetree_with_comment で NODE_ARGS ノードをダンプする時の説明に keyword 引数と keyword rest 引数について追加しています。

[6764256dc7] Yusuke Endoh 2021-11-17 14:39:34 UTC

node.h から struct NODE の各共用体のメンバーにつけた別名で未使用になっているものを削除したり用途別に定義をまとめたりしています。

[1454906d4e] Peter Zhu 2021-11-17 14:07:47 UTC

NoMethodError の発生するメソッド呼び出しを繰り返すと異常終了する不具合の修正 84202963c52e02cecad3e6b2fad478bfbeee1bc7 に対応するテストを追加しています。 https://github.com/ruby/ruby/pull/5121

[864ad8b5d7] git 2021-11-17 18:20:45 UTC

version.h の日付更新

[e1f6ca1911] Yusuke Endoh 2021-11-17 17:40:30 UTC

compile.c のコメントの typo 修正。

[1e9ef03639] Yusuke Endoh 2021-11-17 17:40:53 UTC

compile.c の compile_builtin_function_call() で重複した return 文が書かれていて無意味になっていた後のほうの return 文を削除しています。

[4acac918f4] Burdette Lamar 2021-11-17 18:51:32 UTC

Integer の比較演算子メソッドやビット演算メソッドの rdoc 用コメントの移動とサンプルの追加など。 https://github.com/ruby/ruby/pull/5134

[fdd3eed037] David Rodríguez 2021-11-04 12:12:32 UTC

rubygems の lib/rubygems/specification.rb で Gem::Specification のクラス変数 @@all を利用時に初期化するようにしていたのを class 文のトップレベルで初期化しておくようにしています。参照時に defined? でのチェックを不要にするためみたいです。

[61f023f03b] David Rodríguez 2021-11-17 16:47:25 UTC

rubygems の Gem::Specification._all でクラス変数 @@all を設定するところのリファクタリング。なんか等価なコードにはなってないような気がしますがちょっとよくわからないですね。

[81eba77fc0] David Rodríguez 2021-11-04 12:20:42 UTC

rubygems の Gem::Specification._all でクラス変数 @@all が nil の時のみ初期化するのを ||= を使うようにリファクタリングしています。

[d8dde444e9] David Rodríguez 2021-11-17 16:59:30 UTC

rubygems のテスト用のヘルパーの teardown 内で Gem::Specification._clear_load_cache を呼び出していたのを削除しています。

[f542ab2e6d] David Rodríguez 2021-11-17 17:01:25 UTC

rubygems のクラスメソッド Gem::Specification._clear_load_cache を clear_load_cache と改名して、private メソッドにしています。

[a5cd4a0568] David Rodríguez 2021-11-04 12:23:35 UTC

rubygems の Gem::Specification.reset からクラス変数群をクリアする処理を Gem::Specification.clear_specs という private なクラスメソッドに切り出すリファクタリング

[4bc69a25f3] David Rodríguez 2021-11-04 12:28:30 UTC

rubygems の Gem::Specification::LOAD_CACHE, LOAD_CACHE_MUTEX という定数をクラスのインスタンス変数を使うようにリファクタリングしています。

[8bdb56fcaf] David Rodríguez 2021-11-04 12:40:53 UTC

rubygems の install 処理時の Thread 間排他を Gem::Installer.install メソッドで大きめにしていたのを、クラス変数など共有されるリソースを操作する時にもう少し細かくロック取得するように変更しています。

[cb69c19e8a] Burdette Lamar 2021-11-17 22:00:50 UTC

Integer の rdoc 用コメントの移動やサンプルの追加など手直し。 https://github.com/ruby/ruby/pull/5138

[05a3dc1a65] "S.H" 2021-11-18 04:26:40 UTC

ruby 実装化されている Kernel#Float メソッドでも b1b73936c15fd490159a9b30ab50b8d5dfea1264 で導入された Primitive.mandatory_only? を使って引数の数で分岐するようにメソッドを実装してキーワード引数が渡されなかった時の効率を改善しています。 https://github.com/ruby/ruby/pull/5133 [ruby-core:106110] [Feature #18344]

[b35b7a1ef2] Jeremy Evans 2021-10-18 15:50:10 UTC

Kernel#load には省略可能な第2引数に true を指定するとトップレベルではなくて無名 Module を作成してその中で指定のスクリプトを評価するという機能がありますが、この引数に true でなく Module オブジェクトを渡すと、その Module 内部で評価するという機能を追加しています。なるほど、引数の数は変化せず渡すものが Module だと自動的にそれを利用するようになるのであまり互換性には問題がなさそうですね(一応従来も Module は渡せて、その時に無名モジュールが作られてたのが渡した Module を使うように挙動が変化してはいますが)。 [ruby-core:43774] [Feature #6210]

[2efbb35a8f] Nobuyoshi Nakada 2021-11-18 08:39:28 UTC

GitHub Actions の macOS 環境向けの workflow は削除しています。 macOSインスタンスの利用できる計算量? が厳しくなってきて実行待ちが長くなってきたからみたいです。