ruby-trunk-changes r52044 - r52067

今日は文字列リテラルの評価の高速化や Proc#call の最適化などがありました。

kazu: r52044 2015-10-06 01:43:07 +0900

r51953 の ChangeLog エントリの typo 修正。

svn: r52045 2015-10-06 01:43:19 +0900

version.h の日付更新。

nobu: r52047 2015-10-06 02:29:04 +0900

compile(AST を ISeq に変換)時に dstr ("#{var}" のように文字列リテラル内に式展開を含むもの)の先頭の要素が文字列でなかった時に [BUG] で異常終了させるようにしています。

nobu: r52048 2015-10-06 02:29:40 +0900

klass を 0 にした文字列から String オブジェクトをコピーする rb_str_resurrect() (内部的な共有用文字列オブジェクトからコピーを作る)で r43233 で str_duplicate() を使うようにしてたのを独自に str_alloc() でオブジェクト確保してバッファや flags をコピーするようにしています。 str_replace() でのサイズや Encoding のチェックを含んだコピーから不要な部分を除いて高速化しているようです。

ko1: r52049 2015-10-06 04:44:05 +0900

vm_insnhelper.c のメソッド呼び出し関係の関数 vm_method_call() で zsuper の処理を goto でコードブロックを共有するようになっていたのを、関数として切り出して再利用するようにリファクタリングしています。

ko1: r52050 2015-10-06 06:34:24 +0900

Proc#call など手続きオブジェクトを呼び出すメソッドで control frame を積まずに直接 rb_vm_invoke_proc() を呼び出す最適化を有効にしています。 例外などのバックトレースが変化するのと、TracePoint などで Proc#call のメソッド呼び出しのイベントを検出しなくなるなどの挙動の変化もあるそうです。 [Feature #11569]

ko1: r52051 2015-10-06 06:55:56 +0900

rb_iseq_free() で rb_iseq_t::variable_body の解放漏れをしていたのを修正しています。

akr: r52052 2015-10-06 07:22:56 +0900

r52023 および r52042 で標準添付ライブラリやテストスクリプトに追加していた frozen_string_literal: true の magic comment の前に空のコメント行を追加しています。 emacs の動作に関係あるみたいですが、チケットのほうをみるとあまり関係なかったのかな…? https://bugs.ruby-lang.org/issues/8976#note-49

nobu: r52054 2015-10-06 13:54:10 +0900

struct RBasic::flags の bit を合成したものを定義するマクロを enum の定数定義に含めるようにしています。デバッガで値が取得できるようにするためとのこと。

nobu: r52055 2015-10-06 13:56:16 +0900

RB_CLONESETUP() や RB_DUPSETUP()、RSTRUCT_CONST_PTR()、RSTRUCT_PTR() といったマクロを inline 関数として定義しなおすリファクタリング。これもデバッガで扱いやすくするためみたいです。

nobu: r52056 2015-10-06 15:38:08 +0900

ブロック引数に Symbol を渡したものをメソッド側で Proc オブジェクトとして取り出した時に、r51989 以降の最適化で T_IMEMO 型のオブジェクトがそのまま見えてしまっていたので Proc オブジェクトとして wrap したものを見せるように修正しています。

nobu: r52057 2015-10-06 16:35:52 +0900

r52056 で vm_args.c から呼ぶために sym_to_proc() の static をはずして rb_sym_to_proc() に改名するのに string.c では #define を使っていたのを、ちゃんと string.c 上でも改名しています。

ko1: r52058 2015-10-06 18:49:53 +0900

$SAFE の 3, 4 が廃止されたのに関連して METHOD_ENTRY_SAFE() というマクロとその関連するコードを削除しています。 $SAFE が 3, 4 の時に動的に定義されたメソッドを起動できないという仕様があったんですね。

ko1: r52059 2015-10-06 18:52:50 +0900

r52058 の変更により IMEMO_FL_USER3 と IMEMO_FL_USER4 という bit flags の定数が不要になったので削除しています。

ko1: r52060 2015-10-06 19:24:34 +0900

r52050 の Proc#call などのメソッドを最適化した時に public メソッドとして追加されてなかったのを修正しています。

ko1: r52061 2015-10-06 19:25:25 +0900

vm_call_method0() で method entry の visibility での分岐を if-else から switch 文に書きかえています。

akr: r52062 2015-10-06 21:40:41 +0900

r52042 の標準添付ライブラリ tmpdir の magic comment frozen_string_literal: true の追加で Dir.tmpdir が返す文字列が freeze されたものになる可能性が残っていたので String#dup を追加しています。この位置で dup すると($SAFE が 1以上の時だけですが)これまで以上に複製が多くなるケースもあるような気もしますね。

ko1: r52063 2015-10-06 23:44:06 +0900

Method#arity で引数の数を取得するための関数 rb_method_entry_min_max_arity() で r52050 で有効にしたOPTIMIZED_METHOD_TYPE_CALL のメソッドに対応しています。

ko1: r52064 2015-10-07 01:17:04 +0900

メソッド呼び出しに関する args_info::calling という構造体メンバが未使用になっていたので削除しています。

svn: r52065 2015-10-07 01:17:40 +0900

version.h の日付更新。

ko1: r52066 2015-10-07 01:22:54 +0900

デバッグ用の関数 rb_obj_info_dump() というのを定義しています。標準エラー出力に rb_raw_obj_info() で文字列化したオブジェクトの情報を出力するというものです。

svn: r52067 2015-10-07 01:23:11 +0900

r52066 の ChangeLog エントリの行末の空白除去。