ruby-trunk-changes 2020-12-23

今日は拡張ライブラリ etc や psych の Ractor safe 化や rubygems, bundler の更新、magic comment の shareable_constant_value: literal の挙動の変更などなど多くの変更がありました。

[f08cbdbf7d] Hiroshi SHIBATA 2020-12-22 11:55:35 UTC

doc/standard_library.rdoc の default gems 化した標準添付ライブラリのセクション移動をしています。

[96b8816793] Akinori MUSHA 2020-12-22 12:41:44 UTC

標準添付ライブラリ set を 1.0.1 に更新。主にテストの警告除去とドキュメントの変更。

[9b9cbbbc17] Hiroshi SHIBATA 2020-12-22 12:43:30 UTC

default gems 化された標準添付ライブラリのうちバージョンが更新されてないもの(?)をのきなみ minor または teeny を更新しています。 gem としてもリリースするのでバージョン上げておかないといけないからですね(gem のリリースもされるのだと思います)。

[034c19ce28] Hiroshi SHIBATA 2020-12-22 12:51:15 UTC

拡張ライブラリ json を 2.5.1 に更新して定数 JSON::FAST_STATE_PROTOTYPE と JSON::PRETTY_STATE_PROTOTYPE も復活させています。たぶん JRuby のためかな。

[cae8bbfe62] Koichi Sasada 2020-12-22 08:07:23 UTC

標準添付ライブラリ pp で PP モジュールの特異メソッドとして sharing_detection という attr_accessor で設定できるインスタンス変数がありましたが、VM 全体で共有されるため Ractor で相性がよくないので Ractor local storage を使って実装するように変更しています。

[47b26795d0] aycabta 2020-12-21 19:49:02 UTC

標準添付ライブラリ irbIRB::RubyLex のリファクタリング? ちょっと意図がよくわかりませんでしたが process_continue、check_code_block、process_nesting_level、process_literal_type の引数を明示的に渡すのをやめて引数のデフォルト値としてインスタンス変数を参照するようにしています。暗黙の依存ができてあんまりよくないような気もしますが。

[4131cd05be] aycabta 2020-12-21 19:56:03 UTC

標準添付ライブラリ irb で measure コマンドの設定に渡すコールバック用のブロックへのパラメーターに任意の引数を渡せるようにしています。

[fbcdcbff0d] aycabta 2020-12-21 20:01:35 UTC

標準添付ライブラリ irb のバージョンを 1.2.9 に更新しています。

[0b14abe8e7] aycabta 2020-12-21 20:08:12 UTC

irb の measure list コマンドの実装でブロックパラメーターが外部の変数名と同じで警告対象になってたのを解消しています。

[294552ca6c] aycabta 2020-12-21 14:02:46 UTC

標準添付ライブラリ reline でプロンプトの再計算を incremental search の完了後に強制的に実行させるようにしています。

[b52bc4a9c2] aycabta 2020-12-21 19:38:01 UTC

標準添付ライブラリ reline で incremental search の終了(確定?)のキーバインドに Ctrl-j のほかに設定で追加したものにも対応するようにしています。

[299f5708a2] ima1zumi 2020-12-21 15:59:48 UTC

標準添付ライブラリ reline の行折り返しのための文字幅計算などで(?)インスタンス変数 @ambiguous_width の未初期化のままアクセスする可能性があったのを修正しています。 [ruby-core:101513] [Bug #17405]

[53510d1e8a] ima1zumi 2020-12-22 04:59:14 UTC

299f5708a2274d069c624073ca3958f8625faf35 で Reline::Core の attr_accessor :ambiguous_width を attr_writer のみに変更していましたが、attr_writer は利用されてなかったので削除しています。

[31b17a14ab] Kazuki Tsujimoto 2020-12-22 17:31:02 UTC

パターンマッチで発生させる例外 NoMatchingPatternError の親クラスを RuntimeError から StandardError に変更しています。

[b222a1a494] Kazuki Tsujimoto 2020-12-22 17:32:30 UTC

doc/syntax/pattern_matching.rdoc のサンプルコード内のコメントの評価結果の表示を修正しています。

[487355873a] git 2020-12-22 17:37:59 UTC

version.h の日付更新

[c6d7e02b90] Delton Ding 2020-12-22 06:30:59 UTC

cont.c の ruby_Init_Fiber_as_Coroutine() に rb_ext_ractor_safe() の呼び出しを追加しているのですが、これって拡張ライブラリじゃないと思うからいらないんじゃないのかな? と思ったのですがこの関数は拡張ライブラリになってる fiber のほうから呼ばれているのでいるんですね。コミットログによると Fiber.current と Fiber#alive? を main じゃない Ractor で呼べるようにするためとのこと。
というか、拡張ライブラリとしての fiber って実体はからっぽだけどなんでこういうふうになってるんだっけ。

[f1591b3858] Delton Ding 2020-12-22 07:01:53 UTC

c6d7e02b90f96d9bcd04edd48b7374f31c510b2a で追加した拡張ライブラリ fiber のテストで警告抑制のため子プロセス内で $VERBOSE に nil をセットしています。

[1bd7427f29] Marc-Andre Lafortune 2020-12-22 07:49:27 UTC

NEWS の非互換で新たにこれまで動いてたのがエラーになるという項目についてセクションの最後に移動しています。

[5a6d27fe22] Marc-Andre Lafortune 2020-12-22 07:50:39 UTC

NEWS の非互換で $SAFE と $KCODE の廃止については1つにまとめて書くようにしています。

[fd745cc92c] Marc-Andre Lafortune 2020-12-22 07:52:05 UTC

NEWS の委譲用の引数記法 meth(...) が通常引数の後にも書けるようになったことについてのエントリも後ろのほうに移動しています。

[228fa3ac6e] Marc-Andre Lafortune 2020-12-22 08:27:18 UTC

NEWS に deprecated カテゴリの警告がデフォルトでは表示されなくなったことについて追記しています。この変更は 2.7.2 にも入れられてるので 2.7 からの変更ではないですが 2.7 のリリース後に入った変更なので一応。

[32849dc1bb] Sutou Kouhei 2020-12-22 05:56:47 UTC

拡張ライブラリ fiddle のバージョンを 1.0.5 に更新しています。

[be5faa2519] Takeru Naito 2020-12-22 03:58:12 UTC

標準添付ライブラリ irb の gemspec ファイルの spec.files に lib/irb/cmd/measure.rb が漏れてたので追加しています。

[841d22ea47] aycabta 2020-12-22 17:18:32 UTC

irb で文の途中に空行が含まれてる時の扱いが間違ってたみたいなのでその修正をしているようです。

[05014dcb88] Kenta Murata 2020-12-22 08:33:14 UTC

memory_view.c と拡張ライブラリ fiddle およびそのテストで真偽値として int を使ってた関数に bool 型を使うようにしています。

[74652e640a] Kenta Murata 2020-12-22 15:33:24 UTC

MemoryView の rb_memory_view_t 構造体の len メンバーを byte_size に改名しています。

[b3ea828c8e] Kenta Murata 2020-12-22 15:40:54 UTC

MemoryView 機能のテスト用の拡張ライブラリで利用する T_TYPEDDATA 型クラスで free 関数を登録するようにしています。元はオブジェクト確保時にすぐ解放するようにしてたメモリ領域を GC 時に解放するようにしているようです。

[db0385d657] Kenta Murata 2020-12-22 15:43:18 UTC

MemoryView のテスト用の拡張ライブラリで format 文字列を StringValueCStr() 使ってたのを RSTRING_PTR() で取り出すようにしています。format は NUL 終端してなくてもいいのかな。 memory_view.c での扱いをみるとしてないといけなさそうだけど。

[01ab29cc28] Kenta Murata 2020-12-22 15:43:26 UTC

rb_memory_view_t 構造体のメンバー shape, strides, sub_offsets に const 修飾子を追加しています。

[9636d14f6f] Kenta Murata 2020-12-22 15:51:26 UTC

MemoryView の export しているオブジェクトを管理するために内部的に使う T_TYPEDDATA 型オブジェクトの解放関数 exported_object_registry_free() でテーブル操作を RB_VM_LOCK_ENTER()/RB_VM_LOCK_LEAVE() でロックかけて Ractor 間の競合を避けるようにしています。mark 関数のほうは不要みたいですが解放関数は必要なんですね。lazy sweep だからかな。

[3286380ebc] Marc-Andre Lafortune 2020-12-22 05:02:45 UTC

拡張ライブラリ etc で static 変数を使った排他処理を Ractor 対応のため rb_nativethread_lock_t を使った mutex による排他処理に書き換えています。

[cd63f0358f] Marc-Andre Lafortune 2020-12-22 04:31:11 UTC

拡張ライブラリ etc にも RB_EXT_RACTOR_SAFE() の呼び出しを追加して Ractor safe にしています。

[733ed1e184] Nobuyoshi Nakada 2020-12-22 13:41:54 UTC

拡張ライブラリ ripper の文法エラーのイベントをちゃんと発火させる修正の続きで、f_norm_arg および f_label のルールで ripper では ID ではなく VALUE を渡すように引数の定義の宣言を変更するようにしています。うーむ、報告されているエラーとこの修正の繋がりはよくわからないけど。 [ruby-core:101626] [Bug #17425]

[339227363c] Hiroshi SHIBATA 2020-12-22 23:45:19 UTC

rubygems の 3.2.3 と bundler の 2.2.3 を upstream からマージしています。

[082114da05] Kazuhiro NISHIYAMA 2020-12-23 02:13:50 UTC

標準添付ライブラリ pp の PP.sharing_detection= について rdoc 用コメントを追加しています。

[3df3b47187] Marc-Andre Lafortune 2020-12-23 03:16:18 UTC

tool/search-cgvars.rb というツールを追加しています。 objdump を使ってオブジェクトファイルや共有ライブラリからグローバル変数のシンボルを探すというものみたいです。Ractor safe にする必要がある箇所を探すために使うみたいです。

[02233ed024] Marc-Andre Lafortune 2020-12-23 03:18:41 UTC

3df3b47187d7a137d4eb5a7887e9c8fa22a121c6 で追加した tool/search-cgvars.rb を macOS のツールチェインでも使えるように拡張しています。

[7e44ade565] Koichi Sasada 2020-12-23 04:34:11 UTC

Ractor 起動時に cancel_single_ractor_mode() でグローバル変数ruby_single_main_ractor をクリアするのを警告出力の前に変更しています。警告出力の呼び出しでオブジェクトが生成される可能性があって、それが TransientHeap を使わないモードにしないといけなかったので先にクリアしておく必要があったそうです。

[f14aaa2b12] Hiroshi SHIBATA 2020-12-22 07:09:52 UTC

テスト用のユーティリティ EnvUtil の capture_global_values で Warning[category] の設定を記録しておくのを 3.0 以降でのみ実行するようにしていますが、2.7 でも Warning[category] は動くので 2.7 以降かな? default gem のテストでも EnvUtil 使えるみたいなので(そうだっけ)、gem のほうでのテスト時に古い ruby で動くようにするためみたいです。

[7a094146e6] Nobuyoshi Nakada 2020-12-19 11:42:58 UTC

diff はみてないですが magic comment の shareable_constant_value: literal で定数に代入される値がリテラルでなおかつ Ractor shareable じゃない場合? に SyntaxError を発生させてたのを、実行時に Ractor::Error を発生させるようにしているそうです。 Ractor shareable じゃないリテラルってなんだろ、と思ったら配列リテラルなどで要素に文字列どうしの concat の式があった時などのようです。あれ、これってリテラルのみじゃないって判定されるからチェック対象にならないんだと思ってた。エラーになるのか。 [ruby-core:101472] [Feature #17397]

[e70206f570] Nobuyoshi Nakada 2020-12-21 06:04:06 UTC

test/ruby/test_parse.rb に Ractor 関係のテスト用の専用 assertion メソッドなどのヘルパーメソッドを切り出しています。

[0c450b8647] Nobuyoshi Nakada 2020-12-21 06:11:50 UTC

parse.y の value_expr() で 第2引数の node が remove_begin() を通されるようになってたのをやめています。 begin ... end 節がリテラルと誤判定されるからとのことなので、shareable_constant_value: literal の時の判定の修正のためみたいです。

[d1c7db9d00] Nobuyoshi Nakada 2020-12-21 06:08:22 UTC

test/ruby/test_parse.rb に 0c450b86476322ea4c407d0de4d7d1c5d8523126 の修正に対応するテストケースを追加しています。

[b2aa21b868] Nobuyoshi Nakada 2020-12-21 06:15:35 UTC

test/ruby/test_parse.rb の shareable_constant_value についてのテストメソッドを分割しています。

[c0a2d95cf3] Nobuyoshi Nakada 2020-12-21 23:26:42 UTC

rb_ractor_ensure_shareable() で rb_ractor_shareable_p() の戻り値を RTEST() でチェックしてましたが rb_ractor_shareable_p() の戻り値は bool なので直接評価するようにしています。また shareable じゃなかった時に発生させる例外を Ractor::IsolationError にしています。

[8a1e12499b] Nobuyoshi Nakada 2020-12-22 13:10:11 UTC

magic comment の shareable_constant_value: literal が指定された時に定数に代入するのが完全なリテラルじゃなくて式を含む時もチェックするように? しています。

[61bd28b836] Hiroshi SHIBATA 2020-12-23 04:15:49 UTC

tool/lib/test/unit/core_assertions.rb を default gems の gem 単体のリポジトリでのテスト時に動くように Test::Unit::Runner や MiniTest::Unit の参照を defined? でチェックするようにしています。

[5cf25c55a6] Hiroshi SHIBATA 2020-12-23 05:03:54 UTC

拡張ライブラリ date のバージョンを 3.1.0 に、etc のバージョンを 1.2.0 に更新しています。

[0dd4896175] Koichi Sasada 2020-12-23 05:40:58 UTC

rb_thread_atfork_internal() で fork で子プロセス起動した時に vm->ractor.blocking_cnt を 0 にリセットするようにしています。

[0eb94dae4a] Marc-Andre Lafortune 2020-12-21 02:39:56 UTC

拡張ライブラリ psych の定数に入れる値を freeze しておくようにしています。

[d1963adae8] Marc-Andre Lafortune 2020-12-21 02:41:02 UTC

拡張ライブラリ psych の動的にメソッド定義するところで Module#define_method にブロック渡ししていたのを class_eval に文字列を渡して定義するようにしています。ブロック渡しで外のスコープの参照が含まれるとそれが Ractor 間をまたげないという問題の対策のためみたいです。

[3ee0ad9190] Marc-Andre Lafortune 2020-12-22 01:01:54 UTC

拡張ライブラリ psych の Psych のクラスメソッド内でインスタンス変数(つまりクラスのインスタンス変数)を直接参照していたのを attr メソッド経由でアクセスするようにしています。後で Ractor ごとの変数にするための地均しですかね。

[c5a445d577] Marc-Andre Lafortune 2020-12-21 02:42:25 UTC

3ee0ad919034fbc098939979c872d041a82c4334 の続きでやはり拡張ライブラリ psych の Psych の設定をクラスのインスタンス変数から Ractor local storage を使った実装に切り替えて、Init_psych() で RB_EXT_RACTOR_SAFE() の呼び出しも追加して Ractor safe にしています。

[daec109f42] Marc-Andre Lafortune 2020-12-23 02:29:00 UTC

拡張ライブラリ psych の Psych::Visitors::Visitor.dispatch_cache や Psych::Visitors::YAMLTree の @dispatch_cache で作る Hash オブジェクトに compare_by_identity を呼んで object_id で判定する Hash にするようにしています。高速化のためとのこと。

[dbb4f19969] Takashi Kokubun 2020-12-23 06:23:45 UTC

単項演算子メソッドの Integer#-@ と Integer#~ の実装を integer.rb からの builtin function 呼び出しに変更しています。 MJIT での inline 化による最適化がきくようにするのが主目的のようです。

[81a8d1cf09] Takashi Kokubun 2020-12-23 07:38:01 UTC

tool/ruby_vm/views/_mjit_compile_ivar.erb でインスタンス変数の読み書きの VM 命令を JIT コンパイルする際に生成する C ソースコードから status->max_ivar_index が struct RVALUE に埋め込める数を超えてた時に flags の ROBJECT_EMBED をチェックするコードを出力しないようにするという最適化。あるオブジェクトについて一度インスタンス変数のインデックスが確保されたら減ることはないので、コンパイル時点で埋め込めない数になってたら埋め込まれてるかのチェックは不要なため。

[e052d07163] Koichi Sasada 2020-12-23 07:55:36 UTC

0dd4896175f95c4c2a26d91a97b9fcb9a74cc0c6 の fork 時の vm->ractor.blocking_cnt のリセットを revert しています。 RUBY_DEBUG=1 に定義してビルドした時のテストがエラーになったとのこと。

[313d63c2ac] Nobuyoshi Nakada 2020-12-23 09:06:27 UTC

ObjetSpace::WeakMap のオブジェクト生成の wmap_allocate() で st_init_table() を使ってたところに専用の rb_init_identtable() を使うようにリファクタリングしています。

[aa856d5077] Kenta Murata 2020-12-23 07:54:54 UTC

テスト用のユーティリティ EnvUtil の Warning[category] の保存と復旧のコードを古い ruby でも動くように defined? でのチェックなどを追加しています。

[aad88cc10b] Kenta Murata 2020-12-23 07:51:16 UTC

拡張ライブラリ date で古い ruby 向けにビルドした時のために RUBY_TYPED_FROZEN_SHAREABLE のダミーの定義を追加しています。

[8259d88938] Hiroshi SHIBATA 2020-12-23 09:45:14 UTC

拡張ライブラリ psych の Ractor を使うテストがで使っている assert_ractor が minitest では動かないということで Test::Unit::TestCase が未定義の時にはテストクラス全体の定義を消すようにしています。

[684649ea05] Hiroshi SHIBATA 2020-12-23 10:47:09 UTC

拡張ライブラリ psych のバージョンを 3.3.0 に更新しています。