ruby-trunk-changes r40677 - r40697

今日は Module#singleton_method というメソッドの追加や RGENGC という世代別GC の導入の準備で struct RArray のメンバーのアクセス方法や struct RBasic の klass のアクセス方法の変更などがありました。 また Windows 環境での getipaddrs(3) のエミュレーションの追加もありました。

zzak:r40677 2013-05-13 10:07:50 +0900

Random::DEFAULT の rdoc コメントを追加しています。

svn:r40678 2013-05-13 10:07:55 +0900

version.h の日付更新。

zzak:r40679 2013-05-13 10:31:27 +0900

Hash[] メソッドの rdoc コメントでこれが {} による Hash リテラルと同じだと書かれていたところを修正しています。

yugui:r40680 2013-05-13 11:08:59 +0900

拡張ライブラリ openssl で OPENSSL_NO_SOCK というマクロが定義されていたら OpenSSL::SSL::SSLSocket の定義を削るようにしています。 socket がない環境でも openssl の暗号化関係のライブラリ部分は利用したいプラットフォームがあるのでのような対処をしているそうです。 NativeClient でしょうか。

nobu:r40681 2013-05-13 14:49:47 +0900

class.c のインデント修正のみ。

nobu:r40682 2013-05-13 14:50:38 +0900

特異クラスが存在すればそのクラスを、なければ Qnil を返す C API rb_singleton_class_get() を新設しています。 r40684 の変更のための布石のようです。

nobu:r40683 2013-05-13 14:51:14 +0900

クラスの ID に対応する rb_method_entry_t を返す関数を vm_method.c に追加しています。 これも r40684 のための布石みたいです。

nobu:r40684 2013-05-13 14:52:03 +0900

Module#instance_method に対応する、特異メソッドのみを取り出す Kernel#singleton_method メソッドを追加しています。r40681, 40682, 40683 から連なる変更です。 [ruby-core:54914] [Feature #8391]
method や public_method もそうなのですが、なぜ Object#singleton_method でなくて Kernel#singleton_method になってるんでしょう。

ko1:r40685 2013-05-13 15:03:00 +0900

r37275 で追加した NEWOBJ() + OBJSETUP() をまとめたマクロ NEWOBJ_OF() を利用するように gc.c の rb_data_object_alloc() と rb_data_typed_object_alloc() をリファクタリングしています。
リファクタリングといっても rb_data_object_alloc() で klass が 0 の時の分岐がなくなって常に Check_Type() するようにされていますけどこれは大丈夫でしょうか。

ko1:r40686 2013-05-13 15:25:33 +0900

と思ったら r40685 で rb_data_object_alloc() の Check_Type() を常に呼ぶようになっていたのを修正しています。

ko1:r40687 2013-05-13 15:33:48 +0900

OBJSETUP() マクロの内容を rb_obj_setup() という関数として定義して、OBJSETUP() はこの関数の呼び出しに置き換えるように変更しています。

ko1:r40688 2013-05-13 15:43:08 +0900

r40686 の ChangeLog に klass が 0 になるのは内部的に利用するオブジェクトの時にありえるということを追記しています。

ko1:r40689 2013-05-13 18:41:48 +0900

include/ruby/ruby.h に Array オブジェクトの要素を参照、変更するためのマクロ RARRAY_AREF() と RARRAY_ASET() を追加しています。 今後は RARRAY_PTR(ary)[i] のようにアクセスしたり代入したりしていたのはこのマクロを使うほうが推奨されるようです。これは RGENGC という世代別GC のための変更だそうです。 [ruby-core:54621] [Feature #8339]

ko1:r40690 2013-05-13 18:56:22 +0900

ruby 本体のソースで RARRAY_PTR を使っていたところを RARRAY_AREF() と RARRAY_ASET() を使うように変更しています。 [ruby-core:54621] [Feature #8339]

ko1:r40691 2013-05-13 19:49:11 +0900

オブジェクトの struct RBasic::klass の操作を直接せずに常にマクロを通じで操作するようにしています。 RBASIC_CLASS() でアクセスし RBASIC_SET_CLASS() でセットし、RBASIC_CLEAR_CLASS() で 0 にする(内部的オブジェクトを隠す時に利用)、RCLASS_SET_SUPER() で親クラスを設定するなどのマクロを新設しています。 これは RGENGC という世代別GC を導入するために klass の書き換えに write barrier を挿入したいからだと思われます。この文脈での write barrier って何かというのは「ガベージコレクションアルゴリズムと実装」という本に書いてあるのでこれを参照すると良いと思います。 [ruby-core:54621] [Feature #8339]

ko1:r40692 2013-05-13 20:11:53 +0900

iseq.c の空行を削っています。

usa:r40693 2013-05-13 20:29:32 +0900

Windows 環境で getipaddrs(3) をエミュレートするための関数 getipaddrs() を win32/win32.c で実装しています。詳しいところはわかりませんが iphlpapi.lib というライブラリを利用して GetAdaptersAddresses() という関数を呼び出してエミュレートしているようです。

usa:r40694 2013-05-13 21:21:53 +0900

r40693 の Windows 環境での getipaddrs(3) のエミュレートの続きで、GetAdaptersAddresses() で取得したネットワークアダプタ名を iphlpapi.dll の ConvertInterfaceGuidToLuid とか ConvertInterfaceLuidToNameA という関数を使って変換するようにしています。 拡張ライブラリ socket で使っている if_nametoindex(3) が要求する名前に変換する必要があったようです。

akr:r40695 2013-05-13 21:51:38 +0900

拡張ライブラリ socket の extconf.rb で socketpair(2) の存在チェックを追加しています。 r40693 で rb_w32_socketpair() チェックと一緒に削ってしまっていたので Unix 環境向けに再度追加しています。

kazu:r40696 2013-05-13 22:39:21 +0900

r40687, r40691, r40692, r40694 の ChangeLogtypo 修正。

eregon:r40697 2013-05-13 23:41:08 +0900

r40687 で include/ruby/ruby.h の OBJSETUP() の定義を変更した時に追加したコメントの typo 修正。