ruby-trunk-changes r60763 - r60775

今日は VM 命令の trace 命令を削除して、かわりにトレース有効化時に動的に命令を書き換えるようにする動作方式の変更や \u{} 記法で空っぽのものを許容するようにする変更などがありました。

ko1: r60763 2017-11-14 21:58:36 +0900

VM 命令の trace を廃止して、struct iseq_insn_info_entry に events メンバーを追加して、コンパイル時にその箇所の命令のこの events にフラグを立てて処理するようにして、TracePoint などによるトレースが不要な時のオーバーヘッドを抑えるようにしているみたいです。このため tool/instruction.rb で各命令に trace_ の prefix つきのバージョンも定義しています。でもこの命令は動的に使われるみたいなので、--dump=insns でみようとしても表示されないですね。 [ruby-core:83758] [Feature #14104]

ko1: r60764 2017-11-14 22:18:44 +0900

  • INSERT_ELEM_NEXT -> ELEM_INSERT_NEXT
  • INSERT_ELEM_PREV -> ELEM_INSERT_PREV
  • REPLACE_ELEM -> ELEM_REPLACE
  • REMOVE_ELEM -> ELEM_REMOVE

といった関数名の変更をしています。

ko1: r60765 2017-11-14 22:25:11 +0900

r60763 で追加された update_global_event_hook() という関数で ISeq の trace 版の命令の書き換えが ruby_vm_event_flags の現在のフラグと異なる時だけ実行するようにして不要な処理をスキップするようにしています。

nobu: r60766 2017-11-15 00:37:48 +0900

r59417 の \u{xxxx} 記法で長すぎるのを禁止するようにした修正の追加修正とのことで、空っぽの \u{} は許容するようにしています。空っぽって NUL 文字ってことになるのかな? [追記]NUL 文字じゃなくて空文字列になるそうです。そりゃそうか[/追記] https://github.com/ruby/ruby/commit/7e8b910#commitcomment-25602670

svn: r60767 2017-11-15 00:37:49 +0900

version.h の日付更新。

nobu: r60768 2017-11-15 02:07:47 +0900

compile.c の remove_unreachable_chunk() で LINK_ELEMENT の TRACE タイプはスキップして判定するようにしています。

normal: r60769 2017-11-15 08:20:31 +0900

遅い filesystem 向けの GVL 解放の一環で readdir(3) の間も GVL を解放するようにしています。が、これは後で revert されています。

usa: r60770 2017-11-15 12:44:58 +0900

r60769 の readdir(3) 時の GVL 解放で Windows 版で SEGV してたそうなので、#ifdef _WIN32 の環境では readdir_without_gvl() は READDIR() のままに戻すようにしています。 チケットみると DIR* の扱いが thread-safe じゃなかったとか書かれてますね。 [ruby-core:83772] [Bug #14108]

ko1: r60771 2017-11-15 13:52:39 +0900

compile.c の iseq_set_sequence() で未初期化のメモリ領域の参照の不具合があったようで iseq->body->ci_entries の先のキーワード引数用の領域の MEMZERO() でのクリアを追加しています。どうも VM 命令列の peephole_optimization で命令が消えた時などに、初期化処理も消えて未初期化のままになるようなケースがあったみたいです。

usa: r60772 2017-11-15 14:18:37 +0900

r60769 の readdir(3) の GVL 解放について r60770 に続いてさらに修正。 Windows ではコマンドライン引数のメタキャラクタの展開のために dir_read() が呼ばれる可能性があって、その時に rb_thread_call_without_gvl() はまだ使えないのでエラーになる、というようなことだったみたいです。 [ruby-core:83772] [Bug #14108]

nobu: r60773 2017-11-15 14:50:10 +0900

call_without_gvl() で GET_THREAD() のかわりに GET_EC() を使うようにしています。 けどまあ結局 rb_ec_thread_ptr() で th を取得しているので、あまり変わりはないですね。

normal: r60774 2017-11-15 16:24:26 +0900

r60769 の readdir(3) 呼び出し時の GVL 解放の変更と、その修正の r60770, r60772 を revert しています。

nobu: r60775 2017-11-15 17:02:09 +0900

標準添付ライブラリ tmpdir で Dir::Tmpname.make_tmpname という一時ディレクトリ名を作成するメソッドを削除して、Dir::Tmpname.create の中に展開して、重複していた時のリトライ時に prefix や suffix の文字列の生成が繰り返し行なわれないように最適化しています。