ruby-trunk-changes r65440 - r65471

今日は Transient Heap という新しいメモリ管理のしくみの導入、parser の不具合修正、MJIT で末尾最適化が有効になってた時の不具合修正などがありました。

k0kubun: r65440 2018-10-30 23:57:03 +0900

MJIT で tail call optimization が有効になってるメソッドは inline 化しないようにチェックを追加しています。

k0kubun: r65441 2018-10-31 00:39:18 +0900

wercker.yml で webrick のテストを除外していたのを再び実行するようにしています。

svn: r65442 2018-10-31 00:39:19 +0900

version.h の日付更新。

normal: r65443 2018-10-31 03:26:12 +0900

mjit.c の JIT 単位のリストを解放する free_list() で list->length を 0クリアするようにしています。 "For robustness against future changes." とのこと。

ko1: r65444 2018-10-31 05:46:24 +0900

Transient Heap というメモリ管理の仕組みを導入しています。これはオブジェクトの struct RVALUE に入りきらずに heap に確保するメモリを最初は Transient Heap というところに確保して、mark されて GC を生き伸びた長命のオブジェクトに保持されているものだけ実際に malloc(3) で確保した heap に移動するというしくみです。まずは Array のバッファにのみ利用するようにしています。詳細はチケットのほうに丁寧に書かれてます。 [ruby-core:87538] [Bug #14858]

svn: r65445 2018-10-31 05:46:47 +0900

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

ko1: r65446 2018-10-31 05:49:35 +0900

r65444 で導入した Transient Heap を T_OBJECT 型オブジェクトのインスタンス変数テーブル用にも使うようにしています。 [ruby-core:87538] [Bug #14858]

ko1: r65447 2018-10-31 06:01:55 +0900

r65444 と r65446 の Transient Heap がらみの commit を revert しています。

svn: r65448 2018-10-31 06:02:12 +0900

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

ko1: r65449 2018-10-31 06:53:56 +0900

r65444 のリトライ。 transient_heap.c と transient_heap.h のコミット漏れだったみたいです。 [ruby-core:87538] [Bug #14858]

svn: r65450 2018-10-31 06:54:13 +0900

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

ko1: r65451 2018-10-31 07:01:17 +0900

r65446 のリトライで T_OBJECT 型オブジェクトのインスタンス変数のテーブルに Transient Heap を使うようにしています。 [ruby-core:87538] [Bug #14858]

ko1: r65452 2018-10-31 07:03:42 +0900

T_STRUCT 型オブジェクトでも Transient Heap を利用するようにしています。 [ruby-core:87538] [Bug #14858]

svn: r65453 2018-10-31 07:03:48 +0900

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

ko1: r65454 2018-10-31 07:11:51 +0900

T_HASH 型のオブジェクトで要素数が小さい時には st_table を使わず key と value の対の配列で管理されるので、この時のメモリも Transient Heap を利用するようにしています。これまでも struct RVALUE に埋め込めるサイズでは同様の埋め込みがされてたと思いますが、具体的には 8要素まで配列で管理するようにしたそうなので、T_HASH のデータ管理方法に embed -> array -> st_table と3つの形態を導入して、array の時にのみ Transient Heap を導入したようです。この変更は GSoC の成果を元にしているそうです。 [ruby-core:87538] [Bug #14858]

svn: r65455 2018-10-31 07:12:12 +0900

r65454 のインデントのタブを空白に展開。行末の空白除去など。

ko1: r65456 2018-10-31 07:16:26 +0900

string.c の rb_str_format_m() で rb_str_format() に渡す変数の型が間違ってたので修正。これわざわざ変数に受けてから渡すようになってたってことは昔は const だったのかな。

ko1: r65457 2018-10-31 07:24:35 +0900

NEWS ファイルに Transient Heap について追記しています。

ko1: r65458 2018-10-31 07:55:31 +0900

Transient Heap の変更に関連して(たぶん)マクロや関数の戻り値の型やキャストを変更しています。

k0kubun: r65459 2018-10-31 08:16:16 +0900

r65441 で wercker.yml で webrick のテストを実行するようにしましたが、失敗ログが取れたのでまた除外するように戻しています。

nobu: r65460 2018-10-31 08:43:13 +0900

parse.y でメソッドへのキーワード引数の ** での splat 渡しで SEGV することがあった不具合を修正。位置情報の取得に $2 を参照してたところを @2 を使うように修正しています。うーむ、わからん。 [ruby-core:89648] [Bug #15271]

hsbt: r65461 2018-10-31 09:13:56 +0900

拡張ライブラリ json の gemspec ファイルに非 ASCII 文字が混ってたみたいなので削除しています。バイナリと判定されて差分がみえない……。

shyouhei: r65462 2018-10-31 09:53:43 +0900

.travis.yml で allow_failures から pedanticism を消してます。今失敗するからとのことで、?? と思ったけど、壊れてるぞーって気づかせるためらしいですね。

ko1: r65463 2018-10-31 10:36:39 +0900

rb_raw_obj_info() で format 文字列の %p に渡す引数を明示的に void * にキャストするようにしています。

ko1: r65464 2018-10-31 11:06:33 +0900

hash.c に行コメントの // が使われてたので削っています。

normal: r65465 2018-10-31 11:31:15 +0900

ubf_select() で m->gvl.lock のロック取得を rb_native_mutex_lock() でしていましたが native_mutex_trylock() を使うようにしてデッドロックを避けるようにしています。高負荷時? に二重ロックになる可能性があったみたいです。

ko1: r65466 2018-10-31 11:39:08 +0900

variable.c にも "//" の行コメントが使われてたので削除しています。

nobu: r65467 2018-10-31 11:57:30 +0900

parse.y のインデント除去つきヒアドキュメントに文字列リテラルとの連結があった時に SEGV する不具合があったようで修正しています。このテストコードどう parse されるのか数秒考えた。 [ruby-core:89649] [Bug #15272]

normal: r65468 2018-10-31 12:02:01 +0900

mjit.c および mjit_worker.c で struct rb_mjit_unit の実装に ccan/list を利用するようにしています。ですが後に revert されています。 [ruby-core:89654] [Bug #14867]

shyouhei: r65469 2018-10-31 12:19:37 +0900

transient_heap.c で printf() 系のフォーマット文字列の %p に渡される引数を void * に明示的にキャストしています。

hsbt: r65470 2018-10-31 12:23:30 +0900

rubygems に upstream の最新版をマージしています。

normal: r65471 2018-10-31 15:44:42 +0900

r65468 を revert しています。 CI で SEGV が発生したようです。