ruby-trunk-changes 2019-08-01

今日は stackprof から使われる C API で SEGV する可能性があった不具合修正や nil? メソッドのための最適化命令 opt_nil_p の追加などがありました。

[c94cc6d968] Nobuyoshi Nakada 2019-07-31 11:46:01 UTC

make spec/XXX で rubyspec の特定のファイルのみテストできるようにするターゲットを追加しています。

[e352445863] Aaron Patterson 2019-07-02 10:02:11 UTC

T_IMEMO 型オブジェクトの imemo_env タイプの rb_vm_env_prev_env() の指すオブジェクトを pin して GC.compact で動かないようにしていましたが、gc_ref_update_imemo() でこれも移動できるようにしています。

[8d138e9702] git 2019-07-31 16:43:23 UTC

version.h の日付更新

[5ad2dfd8dc] Aaron Patterson 2019-07-31 17:34:23 UTC

しかし e352445863588b90f7af6cdf6c1b6dc432ee33ab の imemo_env の prev_env を移動可能にしたのは revert しています。

[a1a198d03a] Koichi Sasada 2019-07-31 09:00:33 UTC

mspec の File.realpath を利用するところで Errno::ENOTDIR が発生する可能性があるので rescue する例外クラスに追加しています。

[43d74776a1] Koichi Sasada 2019-07-31 20:21:42 UTC

Hash#rehash のテストで 72825c35b0d8b9d566663de961fddbf4f010fff7 で Hash の array hash 実装の時の hash の下位1バイトしか保持しないようにした影響を考慮して下位 1バイトが異なる hash 値になるキーを選ぶようにしています。うーむ、実装がテストに漏れてる…。

[deddc80476] Koichi Sasada 2019-07-31 20:48:22 UTC

hash.c の HASH_ASSERT() というマクロで常にチェック有効にしていたのを HASH_DEBUG というマクロを参照するようにしています。

[bd1052d55d] Koichi Sasada 2019-07-31 20:50:58 UTC

hash.c の関数マクロ RHASH_AR_TABLE_SET() がたんに hash_ar_table_set() を呼ぶだけになってたのでマクロ定義を削除して直接 hash_ar_table_set() を呼ぶようにしています。

[117241b3c7] Koichi Sasada 2019-07-31 20:59:04 UTC

hash.c の RHASH_AR_TABLE_BOUND_SET()、RHASH_AR_TABLE_SIZE_SET()、HASH_AR_TABLE_SIZE_ADD()、RHASH_AR_TABLE_CLEAR() などの関数マクロを inline 関数として定義しなおしています。

[9faef3113f] Aaron Patterson 2019-06-04 23:29:08 UTC

VM 命令に opt_nil_p という nil? メソッドを最適化する命令を追加して、再定義されてなければ Qnil かどうか直接判定するようにしています。たしかに効きそうだけど nil? どのくらい重いところで使われてるのかなぁ。

[714924fd34] git 2019-07-31 23:21:58 UTC

9faef3113fb4331524b81ba73005ba13fa0ef6c6 のインデントのタブを空白に展開。

[31ec475ad8] Aaron Patterson 2019-06-07 16:11:33 UTC

object.c の rb_false() に MJIT_FUNC_EXPORTED をつけています。 9faef3113fb4331524b81ba73005ba13fa0ef6c6 の opt_nil_p 命令の実装で使うので export する必要があるためその追随ですね。

[67f7e5a224] Kazuhiro NISHIYAMA 2019-08-01 00:12:08 UTC

test/ruby/test_io.rb の IO.pipe の binmode 関係のテストのリファクタリング

[7463867106] Koichi Sasada 2019-08-01 02:20:37 UTC

ebd398ac5a4147a1e652d6943c39a29a62f12e66 の strut RHash の iter_lev を削除して flags に押し込めた変更の追加修正で、flags の領域に収まりきらなくなった時に追加する内部的インスタンス変数の ID を rb_intern() でなく rb_make_internal_id() で作ったものにしています。こうすると Marshal.dump で出力されないらしいです。そうなのか。

[f45bb760fb] Yusuke Endoh 2019-08-01 05:25:15 UTC

signal.c でシグナル名の prefix "SIG" を保持する変数を固定長配列(サイズ3)として宣言してましたが、サイズ指定しない配列として宣言するようにしています。 NUL 終端していない配列が GCC 9.1 で警告されるんだそうです。なるほどー。

[d2f8e03f34] git 2019-08-01 05:27:19 UTC

f45bb760fb0a751915a9eac5f7dc4075e88e0cfc のインデントのタブを空白に展開。

[5d33f78716] 卜部昌平 2019-07-31 14:00:15 UTC

gc.c の gc_event_hook_body() の中で ec->cfp->pc を一時的にインクリメントしていますが、そもそも control frame がない? 時に SEGV をおこす可能性があったので VM_FRAME_RUBYFRAME_P() でチェックしてから操作するようにしています。通常問題になることはなく、C API 経由で TracePoint を使うことで起こす可能性があったみたいです。テスト用の拡張ライブラリみるとけっこうややこしいですが stackprof ではこれが発生してたみたいです。 [ruby-core:87449] [Bug #14834]

[19d3c80e81] 卜部昌平 2019-07-31 14:15:56 UTC

vm_backtrace.c の calc_lineno() の暗黙の了解を明示的に VM_ASSERT() でチェックするようにしています。

[e18e785253] git 2019-08-01 07:04:09 UTC

19d3c80e8136402a26b52c8da46eee071ec413d6 のインデントの空白をタブに展開。

[3a6f51ee35] Koichi Sasada 2019-08-01 07:04:40 UTC

Hash の array hash 実装時に要素の hash 値の下位1バイトだけを保持する時の変数の型を ar_hint_t という独自の型に定義するようにしています。 sizeof(VALUE) が RHASH_AR_TABLE_MAX_SIZE の 2倍あったら 16bit 使うようにしてますが、RHASH_AR_TABLE_MAX_SIZE って SIZEOF_VALUE で定義してるからこれはありえないよなぁ。将来的ななんらかの変更に備えてかもしれないです。

[fd0e3bd249] 卜部昌平 2019-08-01 07:18:45 UTC

5d33f787169bcc3594d2264726695d58c4a06899 のテスト用の拡張ライブラリが動的なサイズの配列宣言で VC2013 でビルドエラーになったそうなので、引数に渡すためのメモリを ALLOCA_N() で確保するようにしています。

[d488464106] Nobuyoshi Nakada 2019-08-01 06:17:52 UTC

parse.y の "|" 演算子の ID を rb_intern() してたところを組み込みの idOr を利用するように修正しています。

[1549fbfda5] Nobuyoshi Nakada 2019-08-01 07:40:03 UTC

同じく enumerator.c で to_proc の ID を組み込みの idTo_proc を利用するようにして rb_intern() を消しています。

[cb84824481] Takashi Kokubun 2019-08-01 10:42:48 UTC

MJIT 用のテストに 9faef3113fb4331524b81ba73005ba13fa0ef6c6 で追加された VM 命令 opt_nil_p を含む命令列を使うテストを追加しています。

[076f3fcf11] Takashi Kokubun 2019-08-01 11:19:18 UTC

Kernel#system でブロックしている時にシグナルハンドラを動かすテストで子プロセスへのシグナル送信までの待ちをちょっと伸ばしています。デッドロック? になることがあるためとのこと。ふーむ system 起動の瞬間にシグナル喪失する可能性があるのかな。

[2eec526053] Kazuhiro NISHIYAMA 2019-08-01 11:34:10 UTC

bootstraptest/test_insns.rb にも opt_nil_p のテストを追加しています。

[8b162ce9d1] Nobuyoshi Nakada 2019-08-01 11:08:22 UTC

5d33f787169bcc3594d2264726695d58c4a06899 の修正の続きで VM_CHECK_MODE が 1以上の時に pc が 0 になることがあるそうで、pc のチェックも条件部に追加しています。