ruby-trunk-changes r49921 - r49941

今日はささださん無双の日で、本来スクリプトを parse した時の AST に利用する T_NODE 型のオブジェクトを内部的に色々使いまわしていたのを T_IMEMO 型のオブジェクトタイプを新規導入して、そちらに移動しています。動作的には影響ない(というかあったら困る)変更ですが内部の実装は大きめの変更でした。また Module#prepend のメモリリークが修正されています。

ko1: r49921 2015-03-11 03:39:46 +0900

大域脱出(throw の他 next,break,continue などの制御文や rb_fatal() による強制終了も含む)の時に rb_thread_t::errinfo に格納されるオブジェクトを struct THROW_DATA という構造体として定義しています。ただし例外の時はそのまま例外オブジェクトが errinfo に格納されるようです。struct THROW_DATA も実際には NODE オブジェクトとして確保されて(つまり struct RVALUE スロットに入り GC 対象となる)、ジャンプの種類によって必要な情報をメンバに持つようにしています。そっか errinfo に NODE を入れるのは next,break などの時に使われてたんですね。ちなみにどんな種類のジャンプなのかは別途 rb_thread_t::state に入ります。

ko1: r49922 2015-03-11 03:50:15 +0900

ブロックから yield した時の control frame にセットされる iseq の ifunc の型の判定を BUILTIN_TYPE() で T_NODE と比較していたのを RUBY_VM_IFUNC_P() という判定用マクロの利用に差し替えています。また RUBY_VM_IFUNC_P() の定義自体も BUILDTIN_TYPE() を使うのではなくて RB_TYPE_P() を利用するようにしています。 これも NODE からの脱却の準備でしょうね。

ko1: r49923 2015-03-11 03:53:28 +0900

r49921 で導入した THROW_DATA_P() の判定でも RB_TYPE_P() を利用するように修正しています。

svn: r49924 2015-03-11 03:53:34 +0900

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

ko1: r49925 2015-03-11 04:57:30 +0900

続いて IFunc も専用の型 struct IFUNC を導入して NODE をそのまま利用するのではなくてキャストして扱うようにしています。

ko1: r49926 2015-03-11 05:07:47 +0900

r49921 の struct THROW_DATA の利用の対応が漏れていて RNODE() を使っていた箇所(rb_catch_protect())でも THROW_DATA_VAL() を利用するように追随しています。

ko1: r49927 2015-03-11 06:28:09 +0900

struct THROW_DATA::throw_state へのアクセスのキャスト追加。

ko1: r49928 2015-03-11 09:20:45 +0900

Enumerator の実装などで内部的に NODE オブジェクトを使って MEMO 化に流用していたところも struct MEMO という専用の構造体を導入しています。 load.c の変更はなにかなぁと思ったら require 時のロックにも同様の使われかたをしていたみたいですね。

nobu: r49929 2015-03-11 12:56:44 +0900

lib/unicode_normalize/normalize.rb の NF_HASH_K という定数に格納される Hash は KOMPATIBLE_TABLE から1文字ずつ引いて join して生成するようにデフォルト値が設定されていましたが、キーには1文字の文字列でしか参照されないので不要ということで削除して KOMPATIBLE_TABLE を直接利用するようにしています。

nobu: r49930 2015-03-11 13:28:51 +0900

FreeBSD 9.1 で libprocstat のチェックで procstat_getvmmap() の存在チェックをせずに procstat_open_sysctl() の存在チェックを流用していたのがうまくいかなかった(procstat_open_sysctl() はあるけど procstat_getvmmap() はなかった)ので procstat_getvmmap() の存在チェックもするようにしています。 [ruby-core:68468] [Bug #10954]

ko1: r49931 2015-03-11 18:15:20 +0900

Module#prepend で作成される IClass の method table の解放漏れでメモリリークしていた不具合を修正しています。また ObjectSpace.memsize_of でのメモリ使用量のカウントにも含まれていなかったのでそれも修正しています。 WriteBarrier 付きの RCLASS_SET_ORIGIN() というマクロの定義も追加しています。

ko1: r49932 2015-03-11 19:36:17 +0900

オブジェクトのタイプに T_IMEMO という新しい型を導入しています。 どうやら NODE 型を流用して struct CREF にキャストしていたものを独立した型にしているみたいですね。 struct RVALUE の共用体に imemo というメンバを追加していて、内容は rb_cref_t ですね。名前的に Enumerator で使ってる struct MEMO のほうかと思いましたが CREF のほうですね。

svn: r49933 2015-03-11 19:36:47 +0900

r49932 の行末の空白除去。

ko1: r49934 2015-03-11 21:04:01 +0900

r49932 の ChangeLog エントリの余分な行を削除。

ko1: r49935 2015-03-11 21:27:34 +0900

今度は struct SVAR の実体を T_NODE 型から T_IMEMO 型のオブジェクトを利用するように変更しています。struct RVALUE の共用体 imemo に struct vm_svar 型のメンバ svar を追加しています。なるほどー、この調子で T_NODE から T_IMEMO に引越しするんですね。なおこれにより r49899 で導入された struct SVAR は struct vm_svar として改名されています。

ko1: r49936 2015-03-11 21:49:27 +0900

struct THROW_DATA も struct vm_throw_data に改名されて T_IMEMO 型の共用体に追加され T_NODE 型から T_IMEMO 型を利用するように変更されています。

ko1: r49937 2015-03-11 21:55:32 +0900

CREF の操作マクロを internal.h から eval_intern.h に移動しています。

ko1: r49938 2015-03-11 22:31:11 +0900

struct IFUNC も struct vm_ifunc と改名されて T_IMEMO 型のオブジェクトの共用体に追加され、T_NODE 型から T_IMEMO 型のオブジェクトを利用するように変更されました。

ko1: r49939 2015-03-11 22:37:15 +0900

r49938 の変更漏れで IFunc を NODE 型で扱っていたままのところがあったのを修正しています。

kazu: r49940 2015-03-12 00:20:25 +0900

r49874 と r49905 の ChangeLog エントリの typo 修正。

svn: r49941 2015-03-12 00:20:48 +0900

version.h の日付更新。