ruby-trunk-changes r52102 - r52107

今日は主にブロック呼び出しの実装の最適化やリファクタリングがありました。

ko1: r52102 2015-10-11 03:49:05 +0900

r52072 で newobj_of() 内の GC 起動無しの時と有りの時の path を分けた関数 newobj_of_init() と newobj_of_slowpass() を newobj_init() と newobj_slowpath() に改名しています。また vm_insnhelper.c のインデント修正。

svn: r52103 2015-10-11 03:49:23 +0900

version.h の日付更新。

ko1: r52104 2015-10-11 05:32:07 +0900

invoke_block_from_c() を invoke_block_from_c_0() と改名して、splattable の有無で invoke_block_from_c_splattable() と invoke_block_from_c_unsplattable() という shortcut 関数を定義するようにしています。また invoke_block_from_c_0() で stack frame を積んで vm_exec() を呼ぶ部分を invoke_block() と invoke_bmethod() という関数として切り出しています。

ko1: r52105 2015-10-11 06:20:59 +0900

vm_call_iseq_setup_normal() において cfp->sp を進めるのを vm_push_frame() の後から前へ移動しています。コミットログによるとパフォーマンスのためということですが、vm_push_frame() 内でここの sp が参照されるのかなと思ったらそうでもなさそうなので、はてなんでだろう。関数の末尾を関数呼び出しにすることで最適化されやすくするとかでしょうか(といっても return Qundef があるので違う気もしますが)。

ko1: r52106 2015-10-11 06:22:54 +0900

rb_yield() に引数の値が Qundef でないかのチェックを省いたバージョン rb_yield_1() を追加して Integer#times の実装 int_dotimes() でブロック呼び出しの時にこちらを呼ぶようにしています。

ko1: r52107 2015-10-11 07:15:18 +0900

vm_push_frame() の cfp の sp と ep 以外のメンバ初期化を先に行なうようにしています。これも performance のためとありますが、どうして速くなるんでしょう…。