ruby-trunk-changes r62388 - r62396

今日は autoload 時に定数の private や deprecate などの属性が効いていない不具合の修正や、Hash (の実装の st_table)にマルチスレッドで競合すると SEGV する可能性があった不具合修正などがありました。

k0kubun: r62388 2018-02-13 00:25:58 +0900

rb_ary_entry() の実装の中身を internal.h に inline 関数 rb_ary_entry_internal() として切り出して、vm_insnhelper.c の最適化命令の実装 vm_opt_aref() から型のチェック後にこの inline 関数を利用することで整数を添字としたアクセスを最適化しています。コミットログに optcarrot を使ったベンチマークの結果(fps)が!

svn: r62389 2018-02-13 00:25:59 +0900

version.h の日付更新。

kazu: r62390 2018-02-13 09:03:18 +0900

mjit.c で xmalloc() の戻り値の NULL チェックをしているところがありましたが、ruby_xmalloc() は NULL を返すかわりに例外を発生させるので分岐を消しています。

mame: r62391 2018-02-13 16:42:51 +0900

process.c の try_with_sh() という関数マクロの定義が fork() が使えない環境で使える環境と引数の数が異なった定義になっていたので統一しています。実際にはこっちのブランチの時はたいてい try_with_sh() が使われていなかった(Windows 環境)ので表に出なかったのではないかと思います。

nobu: r62392 2018-02-13 18:11:02 +0900

Module#autoload で定数アクセス時に load した時に private_constant や deprecated_constant による警告やエラーが効いていなかったという不具合を修正しています。 警告はいいとして private constant のほうは load はしたうえで NameError が発生するわけだけど、まあ load 後もエラーになるわけだし、それで正しいのか。 [ruby-core:85516] [Bug #14469]

usa: r62393 2018-02-13 18:34:37 +0900

と思ったら r62392 を revert しています。 rb_autoloading_value() の引数の変更がヘッダのプロトタイプ宣言に反映されていなかった模様。 [ruby-core:85516] [Bug #14469]

nobu: r62394 2018-02-13 18:34:43 +0900

r62392 のリトライの下準備。 rb_autoloading_value() の prototype 宣言を変更し、cm_core.h から constant.h に宣言を移動しています。 [ruby-core:85516] [Bug #14469]

nobu: r62395 2018-02-13 18:36:35 +0900

そして r62392 のリトライ。 [ruby-core:85516] [Bug #14469]

normal: r62396 2018-02-13 19:02:07 +0900

Hash の実装である st_table の操作する関数群で hash や eql? メソッドを呼ぶために Ruby のメソッド呼び出しを行うところで、Ruby の Thread のコンテキストスイッチがおきる可能性があり、そこで別の Thread でループ中の Hash を操作するメソッドが呼ばれて st_table のテーブルの再構築が行なわれると、SEGV などを起こす可能性があった不具合を修正しています。 struct st_table には元々 rebuilds_num という rebuild した回数を保持するメンバーがあったので、別 Thread が動いた可能性があるポイントでそれをチェックして、変化していたら table->bins の取得からやりなおすように対応をしています。なんか、すごく昔に Hash#each 中に要素を追加しようとするとエラーになるみたいなのを報告したような記憶がかすかにあるけど、いまだこんなのが残っていたとは。というか st.c の実装はちょっと前に高速化のため大きく変わったのでその時に入り込んだのかも? [ruby-core:85510] [Bug #14357]
Hash#each 中に〜の話は http://d.hatena.ne.jp/nagachika/20100630/ruby_hash_insert_during_marshal_dump これだった。なお後に(もう結構前)これは対応されてエラーにならず後から追加できるようになったはず。たぶん Hash が順序保存するようになった後かな。