ruby-trunk-changes r57253 - r57259

今日は標準添付ライブラリ forwardable のパフォーマンスのための実装の変更と、命令列へのコンパイルリファクタリングなどがありました。

kazu: r57253 2017-01-03 11:00:01 +0900

lib/benchmark.rb と test/benchmark/test_benchmark.rb も magic comment の frozen_string_literal を false から true に変更しています。

svn: r57254 2017-01-03 11:00:02 +0900

version.h の日付更新。

nobu: r57255 2017-01-03 17:40:51 +0900

標準添付ライブラリ forwardable.rb で Kernel.instance_method(:respond_to?) で取り出した UnboundMethod を bind して呼び出しているところを defined?(_.#{method}) のようにメソッド呼び出しを展開して defined? でチェックするようにしています。 respond_to? を直に呼ばないのは BasicObject 対策みたいですね。しかし UnboundMethod を使うのは速度的に不利なので defined? を使うようにしてみたみたいです。同様にこれまで直接 respond_to? を使ってたところも defined? に置き換えています。

nobu: r57256 2017-01-03 18:35:26 +0900

r57255 の続き。標準添付ライブラリ forwardable の instance_delegate と single_delegate の引数のハッシュが Enumerator (というか each メソッドを持つオブジェクト)でなかった時の処理を不要な中間オブジェクトの配列を生成しないように条件分岐に置き換えています。

nobu: r57257 2017-01-03 18:47:16 +0900

r57256 の修正。 instance_delegate と single_delegate の条件分岐を書き換えた時に if と unless が逆になっていたのを修正しています。

nobu: r57258 2017-01-03 18:48:43 +0900

compile.c の defined_expr() でメソッド呼び出しのコンパイル時に lfinish[1] が非ゼロの時の条件に引数が1つ以上あるか receiver が明示されていることを条件に追加しています。無引数で receiver のないメソッド呼び出し(のようなもの)だとこの後で lfinish[1] へのジャンプ命令を作らないので不要な LABEL の生成を抑制しているようです。ただこの lfinish がなにをしてるのかみてみようと呼び元を検索してみると lfinish[1] を非ゼロで呼び出しているところはなくて、lfinish[1] が 0 の時にそこに代入しているところもないので、常に 0 になってるんじゃないかという気も…。 lfinish[1] が 0 の時に代入してました。 内部的に defined? 相当の処理でチェックして分岐する時のラベル用だったみたいです。

nobu: r57259 2017-01-03 19:49:12 +0900

iseq_compile_each() で不要な pushnil 命令の抑制をしています。