ruby-trunk-changes r59061 - r59070

今日は local_variable_set で SEGV することがある不具合修正などがありました。

nobu: r59061 2017-06-12 09:18:30 +0900

dir. から rb_dir_getwd_ospath() の Windows 向けの実装を win32/win32.c に移動し、w32_getcwd() にメモリ確保用の関数を引数に渡すように拡張して、String オブジェクトをバッファとして使うように実装しています。malloc() で確保したメモリを xfree() で解放してしまう可能性があったのでそれを避けるためだそうです。

svn: r59062 2017-06-12 09:18:31 +0900

version.h の日付更新。

ko1: r59063 2017-06-12 11:20:09 +0900

get_local_variable_ptr() で引数に rb_env_t のポインタではなくポインタのポインタを渡して、ローカル変数がみつかった時にそれが定義されている rb_env_t のポインタも上書きして返すようにしています。呼び元で RGenGC のための Write-Barrier を効かせるためだそうです。 [ruby-core:81424] [Bug #13605]

nobu: r59064 2017-06-12 13:35:52 +0900

RSTRING_PTR() は引数を2回評価し得るように展開されるので gc.c の rb_raw_iseq_info() で RSTRING_PTR() の引数に rb_iseq_path() の呼び出しを入れていたのを、一度変数に受けてそれを使うようにリファクタリングしています。

nobu: r59065 2017-06-12 13:35:53 +0900

RubyVM::InstructionSequence#inspect で文字列に埋め込むクラス名やファイルパスなどを PRIsVALUE を使うようにしてエンコーディングを保持するようにしています。

ko1: r59066 2017-06-12 13:52:25 +0900

ruby_signal() というコア内部利用用の関数を削除して、直接 kill(3) を呼び出すようにしています。またこれにより rb_thread_t::interrupt_cond という構造体メンバも削除しています。これ不要だったのかー。r47832 で dead lock を避けるために普通のシグナルを kill に変えた時に、SIGSEGV などの特別なシグナルだけ残ってたんですね。 [ruby-core:52864] [Bug #7951]

nobu: r59067 2017-06-12 15:31:02 +0900

thread_win32.c で native_cond_signal(), native_cond_wait() などの関数が未使用になっていたので #if 0 でコメントアウトしています。

ko1: r59068 2017-06-12 16:49:33 +0900

構造体 struct rb_blocking_region_buffer のメッバー oldubf を削除しています。 set_unblock_function() とか reset_unblock_function() でそもそも ubf が登録されている状態でさらに設定しようとするのがおかしいとして VM_ASSERT() で落とすようにして、関数名も変更しています。

ko1: r59069 2017-06-12 16:58:23 +0900

rb_thread_mark() で Thread ごとのマシンスタック上からの参照を保守的に mark する処理を VM スタックの mark の後に移動しています。

k0kubun: r59070 2017-06-12 20:09:10 +0900

Array#<< の rdoc 用コメントのサンプルコードで receiver を変数に格納しておいてから << を実施して、破壊的に変更が行なわれていることを示すようにしています。 https://github.com/ruby/ruby/pull/1646