ruby-trunk-changes r51240 - r51253

今日は rb_proc_t とか rb_binding_t とか rb_env_t などの VM 内部で利用される構造体のメンバの削減がありました。 主に mark 処理のために冗長な参照を持っていたものを他の方法で mark することで使用メモリ削減と高速化が行なわれています。

kazu: r51240 2015-07-15 00:01:39 +0900

r51182 で追加した Random の Linux でのシステムコール getrandom(2) を利用した実装で syscall() の戻り値を受け取る変数を long に変更しています。 clang で警告が -Werror によりコンパイルエラーになってたそうです。うーん確かに Linux の syscall() の戻り値は long みたいですね。 [ruby-core:69931] [Bug #11343]

svn: r51241 2015-07-15 00:01:57 +0900

version.h の日付更新。

kazu: r51242 2015-07-15 00:09:23 +0900

r51240 と同じく clang での警告の修正だそうですが、 STATIC_ASSERT() マクロの定義で GC_VERSION_SINCE() でチェックしていたものを __has_extension() や __has_feature() を使って _Static_assert() マクロを利用するかどうかを分岐するようにしています。

ko1: r51243 2015-07-15 01:23:17 +0900

構造体メンバ rb_proc_t::blockprocval と rb_binding_t::blockprocval を削除しています。これらのメンバは mark 関数で参照しているブロックが解放されてしまわないように mark するために持っていたようですが、同じものは rb_env_t::env 経由でマークできるので不要だったそうです。また rb_env_t::local_size というメンバも rb_env_t::env_size から固定的に計算できるため未使用にできたので削除しています。

svn: r51244 2015-07-15 01:26:10 +0900

r51243 の行末の空白除去。

ko1: r51245 2015-07-15 02:36:36 +0900

構造体メンバ rb_env_t::prev_envval を削除しています。これも rb_env_t::block.ep から取得できるので rb_vm_env_prev_envval() という関数を導入してこれを使って辿るようにしています。また関連して ENV_IN_HEAP_P() → VM_EP_IN_HEAP_P() や ENV_VAL() → VM_ENV_EP_ENVVAL() などのマクロ名の改名もしています。

ko1: r51246 2015-07-15 02:59:03 +0900

更に構造体メンバ rb_proc_t::envval も削除しています。これも mark 処理のためにあったようですが rb_proc_t::block::ep から取得できるため不要だったそうです。またこれを辿るための関数 rb_vm_proc_envval() を追加しています。

nobu: r51247 2015-07-15 08:59:23 +0900

RUBY_MARK_UNLESS_NULL() という NULL チェックをした上で rb_gc_mark() を呼び出すマクロで引数の ptr を1度だけ評価するように展開するように修正しています。

nobu: r51248 2015-07-15 10:29:37 +0900

string.c の bytes や codepoints の実装で Enumerator を返すのに RETURN_SIZED_ENUMERATOR() というマクロを利用していましたが、これは rb_block_given_p() のブロック有無のチェックを含んでいて冗長なので return SIZED_ENUMERATOR() に変更しています。

nobu: r51249 2015-07-15 12:56:17 +0900

テスト用の拡張ライブラリ "-test-/string/string" を "-test-/string" に改名しています。

ko1: r51250 2015-07-15 14:43:07 +0900

vm_make_env_each() のコメントに stack frame と rb_env_t::env と rb_env_t::block::ep の関係について追記しています。 また不要な変数を削除するリファクタリングなども行なわれています。

nobu: r51251 2015-07-15 16:55:08 +0900

enc_autoload() で返す encoding index から dummy encoding のフラグを落として返すようにしています。このフラグは内部的にしか使われていないので、公開関数 rb_enc_get_index() から呼ばれた時に不要なビットが着く可能性があったのを落としているということみたいです。

normal: r51252 2015-07-15 17:29:22 +0900

iseq_mark(), binding_mark(), tb_thread_mark(), tp_mark(TracePoint のオブジェクトの mark 処理)で不要なポインタの NULL チェックを削っています。mark 関数は呼び元で NULL チェック済みなので各 mark 関数内でのチェックは不要なため削っています。

normal: r51253 2015-07-15 18:32:08 +0900

proc_mark() での rb_proc_t::block::iseq と env_mark() での rb_env_t::block::iseq の rb_gc_mark() の呼び出しに NULL チェックつきの RUBY_MARK_UNLESS_NULL() マクロを利用していたのをチェックなしで直接 rb_gc_mark() を呼び出すようにしています。これらは NULL になりえないので削っているとのこと。