ruby-trunk-changes r45365 - r45370

今日は include + alias + super の組み合わせでメソッド呼び出しが意図せず無限再帰状態になる不具合の修正と、Ruby の Thread ではないスレッド(拡張ライブラリから生成されたネイティブスレッドなど)から ruby_xmalloc() が呼ばれた時などに Ruby スレッド前提のコードに入ってしまう可能性があったのを修正しています。

nobu: r45365 2014-03-20 12:21:52 +0900

拡張ライブラリ dl の extconf.rb でコンパイラが clang の時に -fno-defer-pop というフラグを追加していたのですが、clang 5.1 でこのオプションがサポートされなくなったそうで、try_ldflags() で使えるかチェックしてから追加するようにしています。 これはバックポートが必要ですかね。

svn: r45366 2014-03-20 12:21:58 +0900

version.h の日付更新。

nobu: r45367 2014-03-20 12:31:28 +0900

2.0.0 からのメソッド探索の不具合で、Module を include したクラスを継承して、そのサブクラスと親クラスの両方で alias でメソッドを別名に退避して同名のメソッドを再定義した時にメソッドの呼び出しが循環して無限再帰状態になってしまうという不具合を修正しています。これだけ読んでもなんのことかわからないと思いますが、チケットからリンクされている以下の gist の内容を実行すると B の元々定義された foo と再定義された foo のあいだで相互呼び出しになってしまいます。 [ruby-core:60431] [Bug #9475]
https://gist.github.com/benweint/8791007
これ A の include がなければ大丈夫なんですね。 IClass が継承関係に挟まっているために B からの super が親クラスでなく再定義されたメソッドのほうに飛んでしまっていたようです。ちょっとこの変更だけみて alias した時の問題だったのか super の動作の問題だったのかわからないですけど。

ko1: r45368 2014-03-20 13:03:11 +0900

rb_obj_call_init() と rb_class_new_instance() の引数 VALUE* に const 修飾子を付加しています。宣言と定義部分を変更しているだけで RGenGC 用のマクロの変更とかはないので一般的に変更しないものには const をつけておいたほうがいいよねっていう変更かと思います。

ko1: r45369 2014-03-20 13:06:27 +0900

rb_struct_alloc() で RARRAY_PTR() のかわりに RARRAY_CONST_PTR() を使ってオブジェクトの shady 化を防いでいます。 r45368 で変更している rb_class_new_instance() に渡す引数で使っているのでこのための変更だったわけですね。

ko1: r45370 2014-03-20 17:05:35 +0900

objspace_malloc_increase() で garbage_collect_with_gvl() を起動する可能性のあるパスには Ruby の Thread になっているネイティブスレッド以外の、拡張ライブラリから起動されたスレッドなどでは入らないようにしています。 ここにはそのような野良スレッド(造語です)も xmalloc() の呼び出しから入ってくる可能性があるので、その時はあきらめてメモリ確保だけさせてあげるようにするみたいです。 FATAL で異常終了しようかーというような提案もあったようですけど、制限は緩いほうに倒したようです。 [ruby-core:61519]