ruby-trunk-changes 2020-11-27

今日は Random::DEFAULT をプロセス全体で 1つでなく Ractor 毎の乱数生成器が作られるようにする変更や MJIT の最適化などがありました。

[1898e9558a] Takashi Kokubun 2020-11-27 03:23:34 UTC

MJIT のテストで一時ディレクトリ内の MJIT が生成するファイルが残ってた場合に削除するのをファイルの更新日時が 24時間以上前だった時だけにしてたのを常に消すようにしています。

[ead32e6e64] git 2020-11-27 03:25:32 UTC

version.h の日付更新

[eca854041f] Nobuyoshi Nakada 2020-11-27 03:44:45 UTC

random.c の Random クラスの rdoc 用コメントに Random のデフォルトのアルゴリズムは暗号論的用途に使えるものではないのでそういうのに使いたい時は SecureRandom を使うようにと追記しています。

[82541df081] Nobuyoshi Nakada 2020-08-31 13:06:06 UTC

正規表現のテストの $KCODE と $= という特殊変数についてのテストメソッドを分割しています。

[4dbf6f1e51] Takashi Kokubun 2020-11-27 04:08:20 UTC

rb_bug() と同様の C や Ruby のバックトレースを表示したうえで異常終了はしないで続行する rb_bug_without_die() という関数を追加して、CI での実行中に GC.compact の処理で heap page のメモリ領域を保護しているのが violate された時のシグナルハンドラから呼び出して詳細を表示するようにしています。CI の時だけなのでエラーのデバッグのためですね。

[69e77e81dc] Takashi Kokubun 2020-11-27 04:35:24 UTC

4dbf6f1e515bd6a3b03ba9edccabccb780c3f789 の続きで GC.compact 処理中に保護してた heap page へのアクセスを検出した時のシグナルハンドラで rb_print_backtrace() を先に呼び出すようにしています。 rb_bug_without_die() が Ruby レベルのバックトレース出力で異常終了してしまうことがあったみたいなので先に C のバックトレースを出しておくようにしたみたいです。

[4d2c8edca6] Takashi Kokubun 2020-11-27 05:25:09 UTC

MJIT の性能改善のために vm_call_iseq_setup_normal() という関数の引数に extra_type というのを追加してMJIT で生成するコードからの呼び出しの時に積む control frame の種類に VM_FRAME_FLAG_FINISH フラグを追加できるようにしています。後から VM_ENV_FLAGS_SET() でセットしなおす処理を省略するためみたいです。

[8ce1711c25] Takashi Kokubun 2020-11-27 06:41:15 UTC

4d2c8edca69884a41d2f843d36023e3decdb9872 を revert しています。 CI で問題がみつかったみたいです。

[2db2fb9f6c] Koichi Sasada 2020-11-25 19:25:42 UTC

Random::DEFAULT 定数に格納される疑似乱数生成器がプロセス単位で初期化されてたのをやめて Random::DEFAULT には Random そのものを代入しておいて、Ractor 毎に乱数生成器が作成されるようにしています。このためインターフェースをあわせるため Random.seed というクラスメソッドも追加しています。クラスは共有してても実際に動く乱数生成器は Ractor 毎になるようにしています。 [ruby-core:100807] [Feature #17322]

[5496415d31] Koichi Sasada 2020-11-27 08:36:02 UTC

2db2fb9f6c742d5bd0019ccd11c7a375e1b12c0b の続き。 Ractor 毎に Random の背後の乱数生成器を生成するので Ractor の GC の mark 関数にそのオブジェクトの mark 処理も追加しています。

[d409837729] Takashi Kokubun 2020-11-27 08:36:02 UTC

MJIT 最適化で JIT で生成する関数で reg_cfp->self の値をローカル変数に格納しておいてこれを参照するように局所的に GET_SELF マクロを書きかえておくようにしています。ふーむ、そうかコンパイラは reg_cfp が書きかわってるかもしれない場合に毎回参照を辿るコードを吐くからこのほうが速くなるのか。

[f0e2ea2859] Benoit Daloze 2020-11-27 09:29:39 UTC

2db2fb9f6c742d5bd0019ccd11c7a375e1b12c0b で rubyspec の Random::DEFAULT の値について書きかえたテストで Random::DEFAULT が Class であることだけチェックしてたのを Random そのものであることまでチェックするようにしています。

[5d8fe1267d] Yusuke Endoh 2020-11-27 08:51:07 UTC

configure で x86intrin.h というヘッダの有無をチェックするのを target_cpu が i386, x86_64, x64 などのいわゆる x86系(っていうのかな。x64 は Itanium ですよね)の時だけにしています。Apple Silicon の M1 チップ上でのビルド時にファイル自体は存在してるけどコンパイルができなくて警告が出てたそうです。