ruby-trunk-changes 2020-12-14

今日は shareable_constant_value という magic comment を追加して、定数に代入した値が自動的に Ractor 間で共有可能にするようにできる機能が追加されたりしていました。

[ea6856dcdf] Junichi Ito 2020-12-13 22:34:10 UTC

NEWS のバージョンの 2.8/3.0 という表記を 3.0 だけにしています。

[66756c6d42] git 2020-12-13 23:17:34 UTC

version.h の日付更新

[85a7f723c3] Kazuhiro NISHIYAMA 2020-12-14 01:26:04 UTC

doc/csv/recipes/parsing.rdoc の typo 修正。

[fa63052be1] Koichi Sasada 2020-12-12 16:32:17 UTC

vm_ccs_create() で初期化時に capa を 4にしてたのを 0 にして最初はメモリを割り当てないで必要になった時に capa = 1 で確保して、その後倍々で増やしていくようにしています。ところで ccs って何の略だっけ。call cache...

[967040ba59] Koichi Sasada 2020-12-12 20:55:18 UTC

Class/Module ごとのメソッドキャッシュで negative cache を追加して未定義の時というキャッシュがきくようにしています。ところで pCMC ってなんだろう……。

[a8aa169b8f] Koichi Sasada 2020-12-14 01:49:07 UTC

967040ba59799e6b7891168ffbf37cc646988d84 で導入したメソッドキャッシュの negative cache のクリア回数の debug counters の項目を追加しています。

[0362b4c689] Koichi Sasada 2020-12-14 01:50:22 UTC

967040ba59799e6b7891168ffbf37cc646988d84 でメソッドキャッシュを変更したのでメソッドキャッシュについてのテストというのを追加しています。キャッシュがきいてるかというよりそのせいでメソッド呼び出しが思わぬ挙動をしてないかという確認のためのテストみたいです。

[53edb27bac] Koichi Sasada 2020-12-14 05:51:39 UTC

Object#respond_to? でも判定にメソッドキャッシュを利用するようにしています。

[ab869d6b9b] Yusuke Endoh 2020-12-14 06:56:13 UTC

0362b4c689e319e233691ee052cd703bf8d2baa1 で追加した test/ruby/test_method_cache.rb の未使用変数の警告除去のため変数名の prefix にアンダースコアを追加しています。

[8d83334a69] Takashi Kokubun 2020-12-14 07:33:54 UTC

246d7e4f1d92851356d459f424cbc3491135d1ac で bootstraptest/runner.rb で core ファイルがあった時に gdb でバックトレース出力させるために指定する ruby の実行ファイルを RbConfig.ruby で指定してたのをインスタンス変数 @ruby が使えるのでそれを使うようにしています。

[aacd2295d0] Takashi Kokubun 2020-12-14 07:35:27 UTC

246d7e4f1d92851356d459f424cbc3491135d1acgdb で core ファイルのバックトレース表示するのに Kernel#system に渡す引数を Kernel#p で表示するようにしています。なぜかうまくいってない模様。

[da3be76cb0] Koichi Sasada 2020-12-14 08:56:34 UTC

debug counters に inline method cache の cache miss をその種類ごとにカウントする種別を追加しています。

[c37ba2c547] Koichi Sasada 2020-12-14 09:17:35 UTC

debug counters にメソッドエントリのキャッシュミスについての項目を追加しています。

[e889c02550] Junichi Ito 2020-12-13 21:01:51 UTC

NEWS の OpenStruct の非推奨な使いかたについての参照を rdoc のリンクになるようにしています。

[7060d6b721] Koichi Sasada 2020-12-14 09:37:22 UTC

da3be76cb017c188d1a99d8aa14d13c15d93f9d1 の続きで inline method cache の cache miss の理由に結局同じ method entry になった場合の項目を追加しています。

[b1bd223085] Nobuyoshi Nakada 2020-10-09 11:06:30 UTC

magic comment に shareable_constant_value: true/false というのを追加して parse.y の構造体 struct lex_context の shareable_constant_value というビットフラグでその値をセットするようにしています。この時点ではまだ使用されてないです。 https://github.com/ruby/ruby/pull/3681 [Feature #17273]

[f43c71abe0] Nobuyoshi Nakada 2020-10-09 14:06:13 UTC

b1bd223085d7b97d8de8679894a81b7993c26b28 で追加した magic comment の shareable_constant_value が true にセットされているとその中では定数を定義するとその値が freeze されるようにしています。正確には Ractor.make_shareable メソッドが呼ばれるようになっています。

[65450e8f7d] Nobuyoshi Nakada 2020-10-20 08:28:12 UTC

f43c71abe07b4b2b0f8f9a69c567fcd0f38faef6 の続きで magic comment の shareable_constant_value: true が設定されてた時に定数に代入される値を Ractor.make_shareable というメソッドを通すようにしたのをやめて、VM が利用する処理をメソッド化したものを保持する内部的なモジュール RubyVM::FrozenCore に make_shareable というメソッドを生やしてこちらを使うようにしています。再定義されないようにということですかね。

[60f0c376f7] Nobuyoshi Nakada 2020-10-09 14:55:22 UTC

b1bd223085d7b97d8de8679894a81b7993c26b28 の続きで定数への演算子つき代入 (+= とか)でも右辺値を make_shareable メソッドを通すようにしています。

[dc1cc33d69] Nobuyoshi Nakada 2020-10-09 15:44:14 UTC

b1bd223085d7b97d8de8679894a81b7993c26b28 の shareable_constant_value の parse.y での対応の再修正で shareable というルールを追加して struct lex_context::shareable_constant_value の値を返すだけのノードを代入系のルールに挿入してアクション部でこれを参照するようにしています。そして node_assign() 等の関数の引数に shareable フラグを追加して shareable_constant_value() にも引数でこのフラグの on/off を渡すようにしています。なんでだろう。局所的に on/off できるようにするためかな。

[070a990bcb] Nobuyoshi Nakada 2020-10-10 07:24:54 UTC

dc1cc33d691faacccd2c12ce3ca75b24cc89dbf9 のさらに続きで shareable_constant_value のフラグだけでなく struct lex_context の構造体全体を引数で取り回すようにしています。

[11d9983bc3] Nobuyoshi Nakada 2020-10-21 05:11:18 UTC

f43c71abe07b4b2b0f8f9a69c567fcd0f38faef6 のさらに続きで magic comment shareable_constant_value: true が設定された時の定数の値の処理を rb_ractor_make_shareable() を呼ぶようにして再帰的に freeze するようにしています。

[d19601fb56] Nobuyoshi Nakada 2020-10-21 05:35:42 UTC

f43c71abe07b4b2b0f8f9a69c567fcd0f38faef6 で追加した magic comment shareable_constant_value のテストで定数の値のチェックを frozen? ではなく Ractor.shareable? でチェックするように変更しています。

[78cb9b627b] Nobuyoshi Nakada 2020-10-22 07:24:38 UTC

f43c71abe07b4b2b0f8f9a69c567fcd0f38faef6 で追加したテストに magic comment shareable_constant_value: false を指定したケースも追加しています。この magic comment は任意の行に書けるんですね。

[25cf1aca92] Nobuyoshi Nakada 2020-10-22 07:25:28 UTC

さらに magic comment shareable_constant_value のテストに定数への代入の途中に magic comment が書かれたケースのテストも追加しています。

[7060aeedbd] Nobuyoshi Nakada 2020-11-02 10:48:17 UTC

25cf1aca927946595b1325e4fde7f642bba2a706 で追加したテストでは行の途中からのコメントでも shareable_constant_value は効いてましたが、(インデントは無視して)行頭からのコメント行でないと効果を持たないように変更しています。効果のない書きかたをされた magic comment は警告を出力するようにしています。

[89e489d51d] Nobuyoshi Nakada 2020-11-13 05:03:25 UTC

magic comment の shareable_constant_value を true/false の 2値ではなく none/literal/experimental_everything の 3種類の指定ができるようにしています。none は make_shareable を呼ばず、literal は右辺値がリテラルの時のみという意味でしょうが、この時点では none と同じ実装になってます(shareable_literal_constant() という関数を通すようにしているもののまだ return しているだけ)。

[3323174727] Nobuyoshi Nakada 2020-11-26 09:10:42 UTC

89e489d51d164cf22bce3a7580e5695da22fb347 で追加した shareable_literal_constant() を具体的に実装してリテラルの種類に応じて shareable な値を返すようにしています。Array や Hash も各要素が全てリテラルなら再帰的に処理しているようです。

[27520a1e1e] Hiroshi SHIBATA 2020-12-14 10:39:32 UTC

tool/sync_default_gems.rb の digest の同期処理の部分で lib/digest.rb をコピーする時のコピー先のディレクトリ指定に最後に "/" を追加しています。

[c2a60fec2f] Hiroshi SHIBATA 2020-12-14 11:13:12 UTC

拡張ライブラリ psych の 3.2.1 を upstream からマージしています。主に Psych.safe_load_file メソッドの追加とドキュメントで safe_ つきのメソッドのほうを先に紹介するようにしているようです。