ruby-trunk-changes r43727 - r43737

今日は明日から開催される RubyWorld Conference のため松江から更新です。Delegator の再修正、拡張ライブラリ json の 1.8.1 のマージなどがありました。

nobu:r43727 2013-11-20 01:27:40 +0900

r43682 での標準添付ライブラリ delegate.rb の SimpleDelegator#send メソッドの扱いを再修正して委譲先のオブジェクトが send に指定されたメソッドを呼べるか respond_to? でチェックして、呼べなかったら super を呼んで Delegator オブジェクト自身の send メソッドを探索するようにしています。
ちなみに r43682 の時に書いたように委譲先に send メソッドがあった時にはその send メソッドへ委譲されないのですが、これは 1.8 の昔からその挙動だったので、どうも Delegator ではそういうものみたいです。

svn:r43728 2013-11-20 01:27:45 +0900

version.h の日付更新。

nobu:r43729 2013-11-20 01:39:07 +0900

RDoc が拡張ライブラリに対して documented? が nil に対して呼ばれてエラーになる可能性があるので r43006 で行なった対策を再度適用しています。本家に反映されていなかったみたいですね。

nobu:r43730 2013-11-20 02:01:10 +0900

at_exit で登録された終了時の処理を実行する時にブロック毎に TH_PUSH_TAG()/TH_EXEC_TAG()/TH_POP_TAG() を使っていたのを、ひとつの tag を使いまわすようにしています。 そのために TH_TMPPOP_TAG() と TH_REPUSH_TAG() というマクロを新たに定義しています。 r43522 のシステムスタックオーバフロー検出の精度向上のついでかなと思いましたが、別にそういうわけでもなさそうです。

naruse:r43731 2013-11-20 11:55:08 +0900

拡張ライブラリ json の変更を本家リポジトリから取り込んでバージョンを 1.8.1 としています。rb_convert_type() は Qnil を返さないのに返した時の不要な処理があったのを削ったり(https://github.com/flori/json/issues/162)、不正なマルチバイト文字のチェックの強化、コンパイラの警告除去や JSON::GenericObject に load, dump メソッドを追加して JSON から簡単に Struct のようにアクセスできるオブジェクトを作れるようにしています。 ActiveModel などで利用するのを想定しているそうです。

ko1:r43734 2013-11-20 17:40:56 +0900

parse.y で定義している Symbol のテーブルの mark 処理 rb_gc_mark_symbols() で minor GC でのマークは一回だけやるようにするためのフラグ global_symbols.minor_marked をセットして次の major GC (full GC)までは処理をスキップするようにしているのですが(気がつきませんでした。最初の minor GC 以降に追加された Symbol のぶんはマークしなくていいのかな)、 full GC の時にもフラグを立てていたため rb_objspace_reachable_objects_from_root() から呼ばれる時などにフラグを立てると本来の GC からのマーク処理が行なわれなくなってしまっていました。多分 r43719 の修正で顕在化した不具合を修正したということでしょう。

nobu:r43735 2013-11-20 18:01:42 +0900

lambda の呼び出しを無限再帰させて SystemStackError の発生を確認するテスト test_machine_stackoverflow が FreeBSD ではなぜか assert_raise のブロックの外で置きてしまうらしいので、無限再帰させるために使っている Hash の初期化の部分まで assert_raise のブロック内に入れるようにしています。しかしどうもこれでもだめだったそうです。はて?

akr:r43736 2013-11-20 20:05:38 +0900

Random の初期化時に seed として使う数値が非常に大きい時に切り詰めたり、負の数の時に上位の0のバイトを切り詰めたりしていたのをやめて渡された数値をバイト列にしたものを素直にそのまま使うようにしているようです。多分 seed の情報をできるだけ丸めなしに使ってうっかり同じ seed になってしまわないようにしているのではないかと思います。

tarui:r43737 2013-11-20 20:56:36 +0900

tool/instruction.rb のメソッド名の typo 修正。