ruby-trunk-changes 2020-06-09

今日は struct rb_callinfo や struct rb_callcache をマシンスタック上や static 変数など静的領域に確保して T_IMEMO オブジェクトを生成しないようにする最適化や Kernel#sleep の blocking Fiber を使っている時の不具合修正などがありました。

[a3cc9b3c8e] Yusuke Endoh 2020-06-08 15:27:04 UTC

cd3d035e8a0d8555748f564f10ea00458a60355c で拡張ライブラリ psych の gemspec ファイルの中で psych/version.rb を require してバージョンの定数を得るようにしてたのをやめて、相対パスで version.rb を指定して File.read で読み込み module_eval で評価して定数を取り出すようにしています。make test-all した時に ext/ の配下と .ext/common/ 配下のファイルを二重に読み込み定数再定義の警告が出るのを抑制するため。なるほどー。そういう意味だと require_relative でもだめか。

[711031de68] git 2020-06-08 15:34:38 UTC

version.h の日付更新

[0ba27259d3] Jeremy Evans 2020-03-12 22:34:45 UTC

iseq_peephole_optimize() による VM 命令列の最適化で不要な jump 命令の削除に関するもので、ISeq の jump 命令の次の要素が insn の要素になってるかチェックを追加しています。 アライメントの関係で ISEQ_ELEMENT_ADJUST が来ている場合があってその時に異常終了してしまっていたようです。

[42a2fa3b17] Aaron Patterson 2020-06-08 22:08:15 UTC

GC.compact の処理のデバッグ出力の改行を追加して整形。

[877238f2d3] 卜部昌平 2020-06-03 05:21:54 UTC

vm_insnhelper.c の check_cfunc() という関数の分岐を分解して、VM_ASSERT() で me の内容についてのチェックを追加しています。

[3928c151a6] 卜部昌平 2020-06-05 01:14:06 UTC

vm_insnhelper.c の vm_search_cc() と vm_search_method_fastpath() で vm_cc_empty() というアクセサ関数経由で参照している変数 vm_empty_cc を直接参照するようにしています。頻繁に通るところなので効率のためとのこと。

[77293cef91] 卜部昌平 2020-05-29 06:20:57 UTC

vm_ci_markable() という関数を導入して struct rb_callinfo が GC で管理されてるかどうか判定するようにしています。

[8f3d4090f0] 卜部昌平 2020-05-29 07:04:53 UTC

vm.c の static 変数 vm_empty_cc の初期化を Init_vm_objects() で行なってたのから初期化子による初期化に変更しています。生成コードを小さくするためとのこと。また 77293cef91a9aa424c086ae05f03211d9a8a87d3 で行なってた struct rb_callinfo がオブジェクト生成しない場合のフラグを追加して rb_equal_opt() で callinfo と callcache を静的領域のデータを使うようにしています。

[3da9c51973] 卜部昌平 2020-06-03 05:23:23 UTC

rb_vm_search_method_slowpath() で 8f3d4090f037ae35fc9ba6380ee284aec837201f のオブジェクトを生成していない callinfo の対応をしています。

[97f456374d] 卜部昌平 2020-06-01 04:07:49 UTC

8f3d4090f037ae35fc9ba6380ee284aec837201f と同様に rb_eql_opt() でも callinfo および callcache のために T_IMEMO オブジェクトを生成しないようにしています。

[62b471bd44] 卜部昌平 2020-06-01 04:26:44 UTC

vm_call_alias() で vm_cc_fill() 呼び出しをなくして初期化子で全てのフィールドを初期化した構造体を返すようにしています。 Go みたいな記法だなぁ。

[9c287f8caa] 卜部昌平 2020-06-01 04:43:47 UTC

vm_call_symbol() でも callinfo と callcache をマシンスタック上に確保してオブジェクト生成を抑制しています。

[dbbde61cef] 卜部昌平 2020-06-01 04:52:31 UTC

vm_call_method_missing_body() でも同様に callinfo もスタック上の静的領域を使うようにしています。

[be5dfdd8a2] 卜部昌平 2020-06-01 05:01:51 UTC

vm_call_zsuper() でも vm_cc_fill() の呼び出しをやめて全て初期化子で構造体を構造体するようにしています。

[fb3f1f95e8] 卜部昌平 2020-06-01 05:16:55 UTC

vm_call_refined() でも vm_cc_fill() の呼び出しをやめて構造体を初期化子で初期化するようにしています。

[367263c3dd] 卜部昌平 2020-06-01 06:02:44 UTC

vm_call_method() でも vm_cc_fill() の呼び出しをやめて VM_CC_ON_STACK() による初期化子で構造体 struct callcache の初期化を行なうようにしています。

[db406daa60] 卜部昌平 2020-06-01 06:56:54 UTC

vm_yield_setup_args() で struct rb_callinfo の初期化しているところで導入した VM_CI_ON_STACK() マクロを利用するようにしています。

[46728557c1] 卜部昌平 2020-06-01 07:01:30 UTC

VM_CI_ON_STACK() と VM_CC_ON_STACK() のマクロ定義を vm_insnhelper.c から vm_callinfo.h に移動して vm_eval.c の rb_vm_call0() でも struct rb_callinfo をスタック上に確保するようにしています。また vm_cc_fill() は不要になったので定義自体を削除しています。

[88e6799759] 卜部昌平 2020-06-03 05:59:33 UTC

vm.c の static 変数 vm_empty_cc の初期化に VM_CC_ON_STACK() マクロを利用するようにしています。

[4fbe86d0e2] 卜部昌平 2020-06-03 06:06:18 UTC

vm_call_method() で struct rb_callcache の初期化に VM_CC_ON_STACK() を使うかわりにコピー元の構造体を単に代入するようにしています。flags の VM_CALLINFO_NOT_UNDER_GC のセットはしなくてもいいのかな?

[98d099be7e] 卜部昌平 2020-06-03 09:33:59 UTC

88e6799759374cbd6af77a5feb596d806b4e1bd9 の static 変数 vm_empty_cc の初期化子に VM_CC_ON_STACK() マクロを使ってたのが VC ではコンパイルエラーになるそうなので revert しています。

[324038c66e] 卜部昌平 2020-06-04 04:03:13 UTC

直近の変更で関数の引数に渡す構造体ポインタに直接初期化子を書いてるのはやめて一旦変数に格納するように記法を変更しています。

[e1e84fbb4f] 卜部昌平 2020-06-03 09:25:13 UTC

VM_CI_NEW_ID() のかわりに vm_ci_new_id() というマクロを導入して埋め込みのビットフラグを考慮するようにしています。

[ffe58b9c8b] 卜部昌平 2020-06-05 06:55:05 UTC

vm_ccs_push() で callinfo や callcache が GC 可能なオブジェクトかどうかチェックして静的領域だったら callcache の管理用配列への追加をしないようにしています。

[1016cff4ff] 卜部昌平 2020-06-08 05:26:49 UTC

rb_equal_opt() と rb_eql_opt() で rb_call_data::cc メンバーの初期化を USE_EMBED_CI の分岐の外に出しています。 USE_EMBED_CI の時は利用する変数を static 変数にしていたため初期化子で初期化すると利用後に変化している可能性があるため、再初期化しないといけないということみたいです。

[8664f19796] taki 2020-03-14 22:20:09 UTC

lib/singleton.rb の rdoc 用コメントの余分な空白除去。

[adfd4f3916] 卜部昌平 2020-06-09 02:46:01 UTC

GitHub Actions のコンパイラオプションのバリエーションを網羅するやつで cppflags に -DMJIT_FORCE_ENABLE を設定するものを追加しています。

[f4950145cf] 卜部昌平 2020-06-09 03:38:46 UTC

mjit.c の mjit_mark_cc_entries() で call cache の GC mark 処理する時に vm_cc_markable() で flags をチェックして静的領域に確保されたものは mark 処理しないようにしています。

[366646c15e] Hiroshi SHIBATA 2020-06-09 04:12:10 UTC

GitHub Actions の設定 .github/workflows/codeql-analysis.yml を追加。 CodeQL という静的解析による? 脆弱性診断サービスを利用したチェックをするようにしています。 https://github.com/ruby/ruby/pull/3196

[195075e8f5] Koichi Sasada 2020-06-09 06:52:25 UTC

ブロック引数を受け取るのにオブジェクトを確保しないことを確認するテストで呼び出し途中に GC が走ると失敗する(オブジェクトの数が減ってしまう?)ので GC.disable するようにしています。しかしこれ戻してないような……と思ったけど assert_separately で起動される子プロセスの中なので問題ないんですね。

[964829495c] Nobuyoshi Nakada 2020-06-09 09:47:16 UTC

defs/gmake.mk のターゲット名に % を含む動的な(というのかな?)テスト用のターゲットのアクションの "+" ではじまるコマンドの記述から "+" を削ってます。 "+" ではじまるコマンドは make -n オプションが指定されても実行するという意味らしいです。

[b6bae0ec44] "nicholas a. evans" 2020-06-09 04:30:43 UTC

Kernel#sleep が blocking Fiber のために Thread に scheduler が設定されていた時に実際に眠ってた秒数を返さず真偽値を返してた? のを修正しています。https://github.com/ruby/ruby/pull/3198