ruby-trunk-changes r67619 - r67649

今日は readline に互換なライブラリ reline の追加と irb でこれを利用するようにする変更や RubyVM::AbstractSyntaxTree#children の戻り値の一部に種類をはっきりさせるための Symbol の追加などがありました。

k0kubun: r67619 2019-04-19 22:57:21 +0900

README.ja.md に README.md にはあった git でのブランチ一覧の取得方法について追記しています。

tenderlove: r67620 2019-04-20 10:19:47 +0900

3度目の正直なるか。 GC.compact の追加再度コミットされました。T_MODULE/T_CLASS などの super まわりが違うくらいかなぁ。

svn: r67621 2019-04-20 10:20:08 +0900

r67620 の新規追加ファイルの svn property 設定。

svn: r67622 2019-04-20 10:20:09 +0900

version.h の日付更新。

tenderlove: r67623 2019-04-20 10:59:34 +0900

r67620 の GC.compact のテストでオブジェクトの保守的 mark のためにオブジェクトが移動できなくなるのを抑えようとしてオブジェクト生成するメソッドで再帰呼び出しを何度か繰り返してスタックを埋めておくようにしています。マシンスタックを深くしてスタックからの偽 mark を減らそうとしてるのかなぁと思ったのですが、このメソッド Ruby だから C のマシンスタックは使わないよなぁ多分。

tenderlove: r67624 2019-04-20 11:40:41 +0900

r67620 の GC.compact でのオブジェクトの移動時に RubyVM::InstructionSequence オブジェクトが移動すると MJIT の worker にも影響するので mjit.c に mjit_update_references() っていう関数を追加して移動時に MJIT worker にも追随させるようにしています。ちなみに CRITICAL_SECTION_START()/CRITICAL_SECTION_FIINSH() に渡してる関数名がコピー元のままになってるっぽい。

tenderlove: r67625 2019-04-20 12:00:08 +0900

r67624 の再修正。 mjit_update_references() で明示的なキャストを追加して警告抑制しています。

tenderlove: r67626 2019-04-20 12:00:49 +0900

r67620 で追加されたテストで slot 再利用を検出するのに Array#include? を使ってたところを Array#index でチェックするように変更しています。ううむ、これはなんでだろ。

yui-knk: r67627 2019-04-20 12:25:36 +0900

RubyVM::AbstractSyntaxTree#children が返す配列に NODE が NODE_MASGN、NODE_CVASGN、NODE_POSTARG などの時に最後の要素に種類を表す Symbol を含めるようにしています。 Pattern Match で受け取って分解しやすくするためだそうです。

k0kubun: r67628 2019-04-20 12:29:20 +0900

r67624 で追加した mjit_update_references() で stale_units のリストから参照されている iseq も移動に追随させるようにしています。

ktsj: r67629 2019-04-20 12:37:22 +0900

r67586 で導入された pattern match で Array Pattern のマッチ時の AST に NODE_BEGIN を使いまわしていたところを NODE_SPECIAL_NO_NAME_REST という NODE を使うようにリファクタリング? しています。

tenderlove: r67630 2019-04-20 13:13:29 +0900

r67620 の GC.compact のテストに assertion をチェックしてもっと細かくチェックするようにしています。

k0kubun: r67631 2019-04-20 13:50:21 +0900

r67628 と同様に mjit_free_iseq() でも stale_units というリストに入っている ISeq も考慮するように追加修正しています。

nobu: r67632 2019-04-20 14:00:43 +0900

Time#floor というメソッドを追加して、秒の小数点以下の精度を指定した桁(省略されたら秒単位)で切り捨てる丸めを行なった Time オブジェクトを返せるようにしています。 https://github.com/ruby/ruby/pull/2092 [ruby-core:91739] [Feature #15653]

svn: r67633 2019-04-20 14:00:45 +0900

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

svn: r67634 2019-04-20 14:00:45 +0900

r67632 の新規追加ファイルの svn property の設定。

tenderlove: r67635 2019-04-20 14:11:37 +0900

r67620 の GC.compact の追加修正で gc_mark_maybe_() という関数で渡されたオブジェクトの型が T_MOVED と T_ZOMBIE の時は gc_pin() を呼んで移動しないように指定するようにしています。 T_MOVED はそこにあったオブジェクトが移動したって意味なので当然ですね。 T_ZOMBIE は finalizer 待ちのオブジェクトでもうすぐ消えるから、かな?

k0kubun: r67636 2019-04-20 14:44:47 +0900

r67631 が CI でエラーになってるのか、mjit.c の free_list() にデバッグ用に? stale_units リストから要素を削除する時に free_unit() 関数内の iseq メンバーを触る処理を省いた処理を行なうようにしてみています。

k0kubun: r67637 2019-04-20 14:45:56 +0900

でやはりデバッグ用だったみたいなので r67636 は revert されています。

k0kubun: r67638 2019-04-20 14:48:22 +0900

GC.compact でオブジェクトを移動したら MJIT で JIT コンパイルしたコード内に含まれるポインタが不正になる可能性があるので全てキャンセルすることができるようにする仕組みを導入している(TracePoint で trace が有効になった時と同じ)らしい。 mjit_call_p を false にしてます。mjit_call_p はこれまで mjit_finish() で false に落とされていて、再度 true にするパスがなさそうなので、一度 GC.compact するとそれ以降ずっと MJIT 無効になるのかな。

k0kubun: r67639 2019-04-20 14:50:19 +0900

r67636 でデバッグのため? 入れた mjit.c の free_list() での stale_units の特別扱いを r67637 で revert してましたが、再度適用しています。 デバッグ用だから消したんじゃなくて r67638 のテストを先にしたかったので一旦 revert したみたいです。

tenderlove: r67640 2019-04-20 15:08:54 +0900

r67635 の gc_mark_maybe_() での T_MOVED と T_ZOMBIE の gc_pin() 呼び出しを revert して、かわりに gc_ref_update() でオブジェクトを確保する heap の page 単位の has_remembered_objects というフラグの更新を行なうように修正しています。

k0kubun: r67641 2019-04-20 15:54:41 +0900

GC.compact のテストの一部を Travis-CI の macOS および Wercker では skip するようにしています。

k0kubun: r67642 2019-04-20 16:16:11 +0900

r67641 で環境変数 WERCKER_STEP_ID の有無で Wercker での実行か判定しようとしたけどうまくいかなかったようなので RubyVM::MJIT.enabled? だったらとにかく skip するようにしています。

k0kubun: r67643 2019-04-20 16:37:29 +0900

mjit.c の mjit_wait_call() という関数に rb_ の prefix を追加する改名。

k0kubun: r67644 2019-04-20 16:52:59 +0900

r67624 の CRITICAL_SECTION_START()/CRITICAL_SECTION_FINISH() の引数の関数名の typo を修正しています。

aycabta: r67645 2019-04-20 17:51:20 +0900

標準添付ライブラリとして reline という readline 互換なライブラリを追加して、irb で readline が使えない環境ではかわりに reline を利用して readline のような操作感を使えるようにしています。あとひっそり irb の --irb_debug というオプションは削除されています(使ったことないし)。 また reline には複数行の編集をサポートする機能があるそうで、その恩恵にも与ることができるほか completion にもなにやら新機能が入っているっぽい……のですが、この時点で reline より readline のほうが優先してロードされるのだけど reline にしかない multiline 用のメソッドが呼ばれてしまってるためエラーになっていました。

aycabta: r67646 2019-04-20 18:16:16 +0900

r67645 の Reline のテストで helper を require_relative でロードするように修正しています。

aycabta: r67647 2019-04-20 18:23:09 +0900

同じく r67645 で追加しているテスト test/reline/key_actor_emacs_test.rb で require "stringio" が漏れていたので追加しています。

tenderlove: r67648 2019-04-20 18:29:19 +0900

GC.compact の GC.stat(:object_id_collisions) をチェックするテストを MJIT 有効化時には skip するようにしています。

aycabta: r67649 2019-04-20 18:32:44 +0900

irb のテストファイル test/irb/test_completion.rb と test/irb/test_ruby-lex.rb を削除しています。