ruby-trunk-changes r39644 - r39650

今日は require で内部的に余分なオブジェクトの生成を抑える変更や Module#prepend と Marshal.dump の関係の不具合修正などがありました。

nobu:r39644 2013-03-09 08:37:02 +0900

require した時に内部で管理しているインデックスの情報を配列で保持していたところを、要素数が1つの時(おそらくそのケースが大部分なのだと思われます)は Fixnum を直接保有することで余分な Array オブジェクトの生成を抑制するようにすることで高速化しようとしているみたいです。 [ruby-core:53216] [Bug #8048]

nobu:r39645 2013-03-09 08:54:41 +0900

load.c の rb_feature_p() のループに this_feature_index という変数が Qnil だったら入る必要がないのでループ全体を if で括っています。

nobu:r39646 2013-03-09 09:03:40 +0900

load.c で内部的に生成している Array オブジェクトを struct RBasic::klass を 0 にすることで ObjectSpace からも見えないようにしています。

nobu:r39647 2013-03-09 09:05:40 +0900

r39646 で変更した関数に必要な引数の指定が漏れていたのを修正しています。

nobu:r39648 2013-03-09 09:17:51 +0900

r39636 で configure に rm というシェル関数を追加した部分に、この対応は autoconf 2.70 以降を使うように AC_PREREQ() で指定するようになったら消すということを TODO コメントとして追加しています。

marcandre:r39649 2013-03-09 10:01:25 +0900

IO.select の rdoc コメントの typo を修正しています。 https://github.com/ruby/ruby/pull/256

nobu:r39650 2013-03-09 11:58:45 +0900

Marshal.dump は特異メソッドを持つオブジェクトは dump できないのですが、Module#prepend で特異クラスに対して別のモジュールを prepend するとそのオブジェクトが dump できてしまっていたので、RCLASS_ORIGIN() を使って prepend で挿入された(そしてメソッドテーブルが移植された) IClass のほうを検査するようにしています。 prepend 回りはいろいろ出てきますね。
なお特異クラスに include した(つまり Object#extend した)オブジェクトは dump できます。dump できないのはそのオブジェクトの特異クラスに直接メソッドが追加されている場合です。これ、わたしも勘違いして憶えてました。 [ruby-core:53206] [Bug #8043]