ruby-trunk-changes r65991 - r66037

今日は TracePoint#enable のキーワード引数 target, target_line の追加や coverage 利用時の不具合修正、Kernel#exec 時に MJIT の一時ファイルを削除する変更などがありました。

hsbt: r65991 2018-11-26 21:23:45 +0900

tool/sync_default_gems.rb で rdoc の同期の時に実行コマンドのファイルを libexec/ にコピーするようにしています。これも bundler の添付に伴なうものかな。

k0kubun: r65992 2018-11-26 21:36:45 +0900

r65629 の rubygems のテスト対策の require "bundler/xchar" の例外捕捉の変更が r65904 で消えちゃったとのことで再度適用しています。

k0kubun: r65993 2018-11-26 21:50:42 +0900

r65928 で MJIT の worker thread から postponed job で main thread に inline cache や call cache をコピーさせる時に ISeq が GC された場合の対策をしてましたが、それでも SEGV は直らなかったみたいで、さらに mjit_worker() 全体を抜ける時にも struct mjit_copy_job::finish_p に TRUE をセットしておくようにしています。 stop_worker_p が TRUE になって MJIT worker thread の終了が要求されてループを抜ける時に copy job のリクエストが残ってて、ってことかな。けどこの job って mjit_worker() の自動変数(スタック領域に確保されてる)なのでこれを抜けた後で main thread から参照され得るのだとしたらこの finish_p を見るのもまずいような。

k0kubun: r65994 2018-11-26 22:39:53 +0900

r63877 で Kernel#exec などでプロセスイメージを別のコマンドに変更する前に mjit_pause() で MJIT 用の worker thread を止めるようにしていましたが、ファイルの削除も行うため mjit_finish() を呼ぶように変更しています。

nobu: r65995 2018-11-26 23:02:59 +0900

lib/bundler/setup.rb の最初に toplevel return を追加して Gem が未定義の時には実行しないようにしています。 rubygems は使わずに bundler を使う? っていうシチュエーションがあまり想像できないけど。

svn: r65996 2018-11-26 23:03:00 +0900

r65995 で編集した lib/bundler/setup.rb の svn property 設定。追加時に何らかの理由で svn bot が動かなかったのかな。

k0kubun: r65997 2018-11-26 23:45:39 +0900

r65994 の exec 時の mjit_finish() で SEGV するとのことで mjit_finish() からファイルの掃除部分のみを mjit_clean_files() という関数に切り出して、rb_f_exec() からは mjit_pause() とこのファイル掃除のみ呼ぶようにしています。

k0kubun: r65998 2018-11-27 00:12:30 +0900

r65997 を revert しています。効果なかったとのこと。

k0kubun: r65999 2018-11-27 00:12:31 +0900

r65994 の exec 前の MJIT 停止&掃除の処理で mjit_finish() に引数を追加してコンパイルされた unit の handle をクリアしておくことで dlclose(3) で解放されるのを避けるようにしています。 exec 前の時点の場合まだコンパイルされた実行コードが利用され得るので解放するとまずいかも、ということのようです。

svn: r66000 2018-11-27 00:12:34 +0900

version.h の日付更新。

k0kubun: r66001 2018-11-27 00:47:20 +0900

postponed_job_register() による postponed job の登録には race condition があり MJIT worker thread は GVL のないところで動いているので、先にインデックスをインクリメントしてから本体を入れる前に main thread が触ってしまう可能性があるということで、mjit.c 側の排他処理を mjit_postponed_job_register_start_hook() および mjit_postponed_job_register_finish_hook() という関数として export して postponed_job_register() から登録部分でこれを使って排他処理するようにしています。 うーむなるほど。postponed job は GVL が前提になってたのか……。 [ruby-core:89848] [Bug #15316]

k0kubun: r66002 2018-11-27 01:13:56 +0900

r65994 で追加した exec 時に MJIT の一時ファイルを掃除するための変更が Windows でうまくいかない(Windows では open してるファイルは普通消せないので)一旦 skip するようにしています。

ko1: r66003 2018-11-27 03:16:39 +0900

TracePoint#enable に target: というキーワード引数を追加して Method や Proc オブジェクトを指定するとその中でのみイベントフックが有効になるようにしています。 rb_iseq_t の予約済みのフィールドを struct rb_hook_list_struct のリストにして局所的なフックを登録できるようにして、対象の命令のみ trace あり命令に書き換えるようにしています。 [ruby-core:89747] [Feature #15289]

svn: r66004 2018-11-27 03:16:54 +0900

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

ko1: r66005 2018-11-27 03:27:02 +0900

r66003 の型エラー修正のため明示的なキャストを追加。

ko1: r66006 2018-11-27 03:48:48 +0900

r66003 の構造体の初期化で初期化子に変数を使うのが古いコンパイラで使えないのでメンバー毎に代入する記法に切り替えています。

ko1: r66007 2018-11-27 04:59:08 +0900

set_trace_func でトレースの on/off した状態を Continuation で出入りする時に RuntimeError を発生させるようにしています。 [ruby-core:89747] [Feature #15289]

ko1: r66008 2018-11-27 05:16:14 +0900

r66003 の続きで TracePoint#enable に target_line: というキーワード引数も追加して、特定の行でのみ line イベントのフックを有効にできるようにしています。 target キーワード引数と同時に指定する必要があります。なるほどこれはデバッガとかで便利そう。 [ruby-core:89747] [Feature #15289]

svn: r66009 2018-11-27 05:16:16 +0900

r66008 の行末の空白除去。

duerst: r66010 2018-11-27 08:30:43 +0900

r65990 で追加した Unicode の絵文字の grapheme cluster 分割のテストのエラーメッセージをより詳細にしています。

ko1: r66011 2018-11-27 09:39:46 +0900

(おそらく r66003 での?) AppVeyor での rubyspec のエラー? 突然死? の場所を特定するため spec/ruby/core/main/using_spec.rb の一部をコメントアウトしています。

ko1: r66012 2018-11-27 09:44:14 +0900

r66011 の続きで mspec でブロックの中身が空だとダメだったみたいなのでちょっとコメントアウト範囲を狭めています。

nobu: r66013 2018-11-27 10:25:16 +0900

vm.c で invoke_iseq_block_from_c() と invoke_block_from_c_proc() の宣言に ALWAYS_INLINE() マクロを使っているのにさらに inline 修飾子を書いていたのが冗長なので削っています。

duerst: r66014 2018-11-27 11:18:29 +0900

regparse.c に grapheme cluster について Unicode のバージョンに依存した部分に? コメントを追加しています。

ko1: r66015 2018-11-27 11:45:25 +0900

RubyVM::InstructionSequence.of の引数に RubyVM::InstructionSequence のインスタンスを渡した時にそのものを返すようにしています。 r66003 の TracePoint#enable の target キーワード引数で RubyVM::InstructionSequence オブジェクトも渡せるようにするためですね。TracePoint#enable 内部で Proc や Method から ISeq を取り出すために RubyVM::InstrutionSequence.of の呼び出しをしているので。 [ruby-core:89747] [Feature #15289]

svn: r66016 2018-11-27 11:45:26 +0900

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

ko1: r66017 2018-11-27 12:02:41 +0900

と思ったら r66015 の再修正。 rb_method_iseq() が NULL を返す場合に対応するようにしています。

ko1: r66018 2018-11-27 12:12:58 +0900

r66011 と r66012 の rubyspec のテストコメントアウトによる調査の続き。コメントアウトする assertion を変更しています。

nobu: r66019 2018-11-27 12:19:06 +0900

internal.h に rb_typeddata_is_instance_of() という API を追加して iseq.c の RubyVm::InstructionSequence.of の r66015 の変更で追加したインスタンスのクラスをチェックする部分で使うようにしています。

duerst: r66020 2018-11-27 12:56:19 +0900

regparse.c の node_extended_grapheme_cluster() でマジックナンバーで書かれていた property を "Regional_Indicator" という名前を使って書くようにしています。この部分のコメントよくわからないな。 Unicode 10 では Regional_Indicator だけど 11 で Regional_Indicator{2} に変わるから 11 に上げた時に変更しないといけない、という意味かな。国旗を表現する時の property ですね。

duerst: r66021 2018-11-27 13:13:21 +0900

r66020 と同様に regparse.c の node_extended_grapheme_cluster() の property のノード生成を "Grapheme_Cluster_Break=Extend" という名前を使って作るようにしています。

ko1: r66022 2018-11-27 14:42:33 +0900

r66011、r66012、r66018 の続きでどうやら通るようになったので(どの変更で直ったんだろう) rubyspec でコメントアウトしていた assertion を元に戻しています。

nobu: r66023 2018-11-27 15:44:02 +0900

Unicode の絵文字のバージョンを enc/unicode/10.0.0/name2ctype.h にマクロ定義として埋め込むようにしています。

aycabta: r66024 2018-11-27 16:02:36 +0900

rdoc に upstream の 6.1.0.beta2 をマージしています。主にテストのメッセージとの強化や英文の修正など。

mame: r66025 2018-11-27 16:34:21 +0900

coverage を利用している時に compile.c の iseq_set_sequence() で counter 配列のインデックスに誤って -1 を使って書きこむ恐れがあった不具合を修正しています。行番号に 0 が返ってきてしまうことがあって、その時に配列の先頭のひとつ前を破壊してしまっていたようです。 [ruby-core:90085] [Bug #15346]

svn: r66026 2018-11-27 16:34:25 +0900

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

nobu: r66027 2018-11-27 17:39:38 +0900

.travis.yml の before_script で複数行を 1つの文字列にまとめていたところを別々のコマンドに分割しています。

nobu: r66028 2018-11-27 17:39:39 +0900

.travis.yml で CC が異なる時に config.cache を削除してから configure しなおすようにしています。

nobu: r66029 2018-11-27 17:39:40 +0900

.travis.yml の before_script での CC の設定に bash 依存があったのを修正しています。

duerst: r66030 2018-11-27 18:44:35 +0900

regparse.c の node_extended_grapheme_cluster() から node_new_quantifier() で Node を生成してエラーチェックする処理を quantify_node() という関数に切り出すリファクタリング

duerst: r66031 2018-11-27 19:15:45 +0900

regparse.c の node_extended_grapheme_cluster() から create_property_node() で Node 生成してquantify_node() に渡す処理を quantify_property_node() という関数として切り出して共有するリファクタリング

svn: r66032 2018-11-27 19:15:46 +0900

r66031 の行末の空白除去。

duerst: r66033 2018-11-27 20:04:02 +0900

regparse.c の node_extended_grapheme_cluster() から複数の Node を node_new_list() にまとめる処理を create_sequence_node() という関数に切り出すリファクタリング

k0kubun: r66034 2018-11-27 20:24:19 +0900

r66033 での配列の初期化子に変数が入っているのが古いコンパイラで動かないのでインデックスごとに代入するように書き換えています。

k0kubun: r66035 2018-11-27 21:00:51 +0900

r65993 で mjit_worker() の最後で mjit_copy_job_t.finish_p を TRUE にしておくようにしていましたが、この変数はスタック上に置かれるので mjit_worker() を抜けると thread も終了してしまうので main thread から finish_p を見るのも NG なので、これを mjit_copy_job という static 変数として定義してをのポインタを使うようにしています。

hsbt: r66036 2018-11-27 21:08:19 +0900

bundler に upstream の 2.0.0.pre.2 をマージしています。

svn: r66037 2018-11-27 21:08:21 +0900

r66036 で変更したファイルの svn property 設定。