ruby-trunk-changes r63368 - r63391

今日は主に一時バッファ用のメモリ確保に String オブジェクトを使ってたところの修正(alignment 問題のため)や T_IMEMO 型オブジェクトによるメモリ確保の API の整理、csv.gemspec の修正などがありました。

shyouhei: r63368 2018-05-09 14:42:06 +0900

r63362 のリベンジ? ISEQ_ORIGINAL_ISEQ_ALLOC() でメモリ確保のために rb_str_tmp_new() を使ってたのを ruby_xmalloc2() に変更して構造体メンバー original_iseq を VALUE でなく VALUE* 型でポインタとして直接バッファを持つようにしています。

mame: r63369 2018-05-09 15:12:17 +0900

T_IMEMO 型のオブジェクトで GC のきくメモリ領域確保のための rb_imemo_alloc_new() で余計な引数を受け取ってたのを buff だけ受け取るようにしています。これはたぶん元は T_NODE を使ってたので NODE の初期化関数の型にあわせてたのかな。またこれにより NEWHEAP() という rb_imemo_alloc_new() の wrapper マクロを定義して使っていたのを直接呼ぶように修正しています。

shyouhei: r63370 2018-05-09 15:55:11 +0900

rb_ast_new() のプロトタイプ宣言に明示的に無引数の void をつけて宣言するようにしています。

mame: r63371 2018-05-09 16:08:53 +0900

rb_imemo_alloc_new() は戻り値を VALUE に変更して確保したオブジェクトの VALUE をそのまま返すようにして、一時的なメモリバッファ確保用には rb_imemo_alloc_parser_heap() や rb_imemo_alloc_auto_free_pointer()、rb_imemo_alloc_auto_free_maybe_mark_buffer() といった用途別に signature の異なる別の関数を定義して使うようにしています。

mame: r63372 2018-05-09 16:11:59 +0900

T_IMEMO 型オブジェクトのサブタイプの imemo_alloc を imemo_tmpbuf に変更しています。

shyouhei: r63373 2018-05-09 16:46:11 +0900

process.c の rb_execarg_parent_start1() などで String オブジェクトをバッファの確保に使っていたのを r63371 で導入した T_IMEMO 型のオブジェクトによる一時バッファ確保を使うようにしています。

hsbt: r63374 2018-05-09 18:35:12 +0900

lib/csv/csv.gemspec でバージョン番号を定数 CSV::Version を参照していたのを直に書くように修正しています。

shyouhei: r63375 2018-05-09 18:53:19 +0900

構造体 rb_execution_context_t のメンバー machine::regs を VALUE 型の alignment にあわせるために RUBY_ALIGNAS() を使ってメモリ確保するようにしています。

hsbt: r63376 2018-05-09 20:44:06 +0900

r63374 の csv.gemspec の修正の再変更。 require_relative するようにしてやっぱりバージョン番号は定数参照するようにしています。

hsbt: r63377 2018-05-09 20:44:30 +0900

csv.gemspec の spec.files を Dir.glob を使わずにファイルリストをハードコードするようにしています。

kazu: r63378 2018-05-09 21:51:14 +0900

test/ruby/test_rubyoptions.rb の nil チェックのための後置 if つきのメソッド呼び出しを &. 演算子を使うように書き換えています。

k0kubun: r63379 2018-05-09 22:09:01 +0900

r63360 の MJIT でコンパイルしたコードが VM スタックに未初期化の領域を残してしまう問題の修正がまた別の問題を引き起こしてたそうで、一旦 revert しています。

nobu: r63380 2018-05-10 01:12:41 +0900

iseq.h の ISEQ_ORIGINAL_ISEQ_ALLOC() で呼び出してる ruby_xmalloc2() の引数の順番が逆だったので修正しています。結局中ではかけ算して領域のサイズを決めてるのでたぶん動作に問題はなかったと思うけど意味的に逆だったようです。

svn: r63381 2018-05-10 01:12:42 +0900

version.h の日付更新。

k0kubun: r63382 2018-05-10 02:11:07 +0900

r63350 の MJIT でメソッドの再帰的呼び出しを実装している C 関数の再帰呼び出しにする最適化を revert しています。r63379 で r63360 を revert したけど実は r63350 のほうが問題だったみたい、とのこと。

nobu: r63383 2018-05-10 02:17:06 +0900

r63248 で iseq_peephole_optimize() に導入した jump+leave 命令の jump を消す最適化で1命令挟んでても訊くようにする変更で dniobj の代入を if 文の条件部でやってたやつの順番を移動しています。トリッキーだなぁと思ってたら gcc 8.1.0 では警告が出てたそうで。

k0kubun: r63384 2018-05-10 02:19:23 +0900

r63360 の MJIT の VM スタック未初期化問題のリトライ。 原因らしい r63350 のほうを revert したので再適用しています。

nobu: r63385 2018-05-10 02:40:04 +0900

r63371 あたりで T_IMEMO 型でメモリ確保する処理をわけましたが、利用するためのバッファ領域を確保してからオブジェクトを確保するとオブジェクト確保の時点で失敗して例外が発生するとメモリリークする恐れがあるので、先にオブジェクトスロットを確保してからバッファ領域を確保して代入するように修正しています。

yui-knk: r63386 2018-05-10 09:23:23 +0900

ruby --dump=parsetree_with_comment で表示される NODE_DEFN と NODE_DEFS のコメントの typo を修正しています。

normal: r63387 2018-05-10 10:19:20 +0900

Module#autoload による遅延 load 時の排他処理のためのデータ構造を変更して struct autoload_state から struct autoload_const という linked list の構造体を分離して 1つのファイルに対して複数の autoload 設定? を対応づけられるようにしています。そこそこ大きな変更なので読み切れてませんがチケットみるにやはり複数の定数で同じファイルを load 対象として設定した時の deadlock の恐れがあったのを修正しているようです。 [ruby-core:86935] [Bug #14742]

shyouhei: r63388 2018-05-10 11:54:04 +0900

ruby.c の moreswitches() でも r63373 などと同様に String オブジェクトをバッファ確保のために使うのを alignment の点から問題として ALLOC_N() を使うように変更しています。

normal: r63389 2018-05-10 13:18:28 +0900

r63387 の続き。構造の変更をよく把握していないのでこれもよくわかってませんが GC の free 処理中に rb_autoload_str() から rb_hash_new() など GC の走る可能性のある関数を呼ぶのをやめて rb_hash_new_compare_by_id() のほうを直接呼ぶようにしたり、free() 漏れがあったのを修正したりしているようです。 [ruby-core:86935] [Bug #14742]

normal: r63390 2018-05-10 14:10:13 +0900

r63387 と r63389 の autoload の排他処理の変更を revert しています。 64bit 環境で問題があったそうです。

yui-knk: r63391 2018-05-10 15:34:20 +0900

NODE_NIL の位置情報のカラムを修正しています。このシリーズ久しぶりだな、と思ったら最近追加された終端を省略した Range のリテラル表記 (a..) での終端部分のための NODE_NIL についてみたいですね。