今日は Thread と Fiber で VM スタックの再利用を共有できるようにする変更や Enumerable#all?, any? などのメソッドでブロックが呼ばれない場合に渡されていたら警告を出力する変更などがありました。
k0kubun: r64699 2018-09-12 22:32:11 +0900
tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb で MJIT 用のスタックコピーのコードで memcpy(3) を使うという TODO コメントがありましたが、実際にやってみたら optcarrot でむしろ遅くなったとのことでコメントを削除しています。
nobu: r64700 2018-09-12 23:37:51 +0900
time.c で time_utc_or_local() という関数で引数 utc_p に応じて timegmw() または timelocalw() で時刻を取得して Time オブジェクトを生成してましたが、呼び元は 2つだけなのでその呼び元にそれぞれ展開してこの関数は削除しています。
kazu: r64701 2018-09-13 01:05:07 +0900
r64696 で追加した Enumerator::ArithmeticSequence#each の rdoc 用コメントで each にブロックを渡さなかった時には self を返すのでそれがわかるように call-seq の戻り値部分を書き換えています。
svn: r64702 2018-09-13 01:05:08 +0900
version.h の日付更新。
normal: r64703 2018-09-13 05:49:10 +0900
thread とその fiber の VM stack を共有するようにしています。 グローバルな設定で thread の VM スタックサイズと Fiber の VM スタックサイズが一致してたら都度確保せずに、USE_THREAD_DATA_RECYCLE が真の時に thread の VM スタック使いまわしをしていた機構を Fiber でも利用するようにしています。 [Feature #15095] [Bug #15050]
normal: r64704 2018-09-13 05:49:14 +0900
ec_set_vm_stack() で代入の左辺に謎のキャストがあったのを消しています。 元は r60440 で ko1 さんが書いてたもので、const がついた時のことを考慮してのものだった? みたいですが、先のことはまた後で考えることにして現状不要なので消しています。 [ruby-core:88929]
normal: r64705 2018-09-13 05:49:19 +0900
fiber_memsize() で root fiber かどうかの判定に rb_context_t::type をみていたのを、th->root_fiber とのチェックでできるので type に依存しないようにしています。 [ruby-core:88762] [Bug #15050]
normal: r64706 2018-09-13 05:49:24 +0900
r64705 と同様に root_fiber かどうかの判定を rb_context_t::type の ROOT_FIBER_CONTEXT というに依存せず対応する th の root_fiber との比較で行なうようにして、Fiber では常に FIBER_CONTEXT を使うように修正しています。 r64589 で fork 時に root_fiber をつけかえるようにしたので、その時の問題を減らすための修正だったようです。 [ruby-core:88762] [Bug #15050]
normal: r64707 2018-09-13 10:43:03 +0900
fork 時に th->interrupt_lock の mutex を再初期化するようにしています。fork 時に子プロセスでは他の thread が死ぬので、それらの thread が lock したままだとデッドロックを起こすので再初期化しています。
k0kubun: r64708 2018-09-13 10:45:38 +0900
appveyor.yml でテストに --subprocess-timeout-scale オプションで子プロセスを起動するテストのタイムアウト値を一律 1.5 倍に指定するようにしています。
shyouhei: r64709 2018-09-13 12:46:46 +0900
r64677 で VM_CHECK_MODE が有効な時の VM 命令の leaf フラグの正当性チェックのために VM スタックに置いておく canary data の処理を、生成する C ソースコードでマクロとして定義しておいてそれを使うようにリファクタリングしています。生成されたソースコードの可読性のためみたいです。
nobu: r64710 2018-09-13 13:53:52 +0900
node.h で enum node_type の定数に同じ名前に展開する謎の #define があったのを削除しています。これ謎ですよね。けど結局なんでだったんだろう。
k0kubun: r64711 2018-09-13 15:39:40 +0900
mjit_exec() の引数に struct rb_iseq_constant_body::catch_except_p のチェックをバイパスできる引数 guard_except_p を追加して不要なのが自明な時はチェックしないようにしています。
k0kubun: r64712 2018-09-13 15:49:49 +0900
thread.c の hrtime_update_expire() でデバッグメッセージ出力の警告除去のための明示的キャストを追加しています。
k0kubun: r64730 2018-09-13 16:12:07 +0900
r64711 の mjit_exec() の引数追加を revert しています。分岐を入れた場所がおかしくて guard_except_p に TRUE を渡して呼び出した時に JIT コンパイルしたコードの呼び出しをしなくなる可能性があったため。
nobu: r64731 2018-09-13 19:59:12 +0900
r64712 の再修正。 hrtime_update_expire() のキャストの型をフォーマット指示子にあわせてプラットフォームに依存しないように uint64_t にしています。
nobu: r64732 2018-09-13 20:00:55 +0900
qsort_r() がマクロとして定義されていた時に configure での検出時に展開されるのを防ぐために prototype 宣言の関数名をかっこでくくっています。へー、こうするとマクロの展開を抑制できるのか。 https://github.com/ruby/ruby/pull/1954
nobu: r64733 2018-09-13 20:10:24 +0900
Enamerable#all?, #any?, #one?, none? に引数が渡された時にはブロックは呼び出されないので、ブロックも渡されてた時には警告を出力するようにしています。 https://github.com/ruby/ruby/pull/1953
kazu: r64734 2018-09-13 21:06:18 +0900
misc/ruby-mode.el を削除しています。既に emacs に ruby-mode.el が bundle されるようになっているそうなので ruby のリポジトリから削除します。 [ruby-core:46913] [Feature #6823]