ruby-trunk-changes r48686 - r48700

今日は encoding まわりの初期化のロード処理の変更や Windows での spawn のメモリ管理不具合修正などがありました。

headius: r48686 2014-12-03 03:22:15 +0900

Proc オブジェクトを instance_eval にブロック引数として渡した時にブロックの self がすりかわったままになってしまわないことを確認するテストケースを追加しています。 jruby での不具合についてのテストみたいですけど、CRuby でも昔似たような不具合があったような気がしますね。

svn: r48687 2014-12-03 03:22:27 +0900

version.h の日付更新。

headius: r48688 2014-12-03 07:08:05 +0900

標準添付ライブラリ open3 の Kernel#popen3 に環境変数として Hash を第1引数に渡した時の挙動のテストを追加しています。

nobu: r48689 2014-12-03 09:48:59 +0900

拡張ライブラリ racc に含まれている racc/cparse の Racc::CparseParams の実装を RData から RTypedData に切り替えています。

usa: r48690 2014-12-03 11:16:42 +0900

Windows 版での spawn の実装 w32_spawn() でメモリ解放がはやすぎて利用中のメモリ領域を解放してしまう可能性があったのを修正しています。ALLOCV() を使っていたのでサイズが小さいとマシンスタック上に確保するので発覚しにくかったみたいです。 [ruby-core:66648] [Bug #10563]

nobu: r48691 2014-12-03 12:25:02 +0900

拡張ライブラリ tk でも Tk::CallbackSubst::Info の実装を RTypedData に切り替えています。

nobu: r48692 2014-12-03 12:25:06 +0900

include/ruby/ruby.h で klass が 0 の内部的オブジェクトの時は RData 型のオブジェクトを使っても警告を出さないようにしています。これにより tk で一箇所警告を抑制するマクロを警告有効にしています。

nobu: r48693 2014-12-03 12:25:12 +0900

include/ruby/intern.h のリファクタリングで RETURN_SIZED_ENUMERATOR() から rb_enumeratorize_with_size() の呼び出し部分を SIZED_ENUMERATOR() というマクロとして切り出して string.c の rb_str_enumerate_chars() でこれを利用しています。 条件分岐部分が重複していて不要だったので効率化のためみたいですね。

nobu: r48694 2014-12-03 13:04:02 +0900

r48692 で拡張ライブラリ tk の RData 型オブジェクトの利用の警告有無のマクロを有効にしたのですが、Data_Get_Struct() マクロの利用時には内部オブジェクトでも抑制されなかったのでやっぱり警告なしに戻しています。

nobu: r48695 2014-12-03 14:34:10 +0900

setup_fake_str() という ObjectSpace に属していないのだけど String オブジェクトとしての操作はしたい、というオブジェクトもどきを作る関数で struct RBasic::flags に ELTS_SHARED を立てて共有されているようにみせていましたが、本当に欲しいのは解放が不要であるということなので STR_NOFREE というフラグに変更しています。 r47639 あたりで(今年の9月)導入されたフラグなので、以前は解放を防ぐために ELTS_SHARED を流用していたけど不要になったということでしょうか。

nobu: r48696 2014-12-03 14:51:28 +0900

rb_require_safe() から大域脱出の処理を除いた部分を rb_require_internal() という関数に追い出して、初期化時の enc/encdb と enc/trans/transdb のロード処理に rb_require_internal() を利用するようにしています。これは r48700 の下準備だそうです。

nobu: r48697 2014-12-03 15:13:58 +0900

r48696 の続きで rb_require_internal() で結果を表す戻り値を変更して、ロードされたら 1 を、既にロード済みだったら 0 を、エラー時は負(-1)を返すというぐあいに1つずつずらしています。

nobu: r48698 2014-12-03 16:47:11 +0900

r48696 で Init_enc() で enc/encdb と enc/trans/transdb の require が実行されるようになったため enc/prelude.rb での require が不要になったので削除しています。

nobu: r48699 2014-12-03 16:47:37 +0900

enc/encinit.c.erb で生成するソースで組み込みのエンコーディングを直接 Init_xxx() や Init_trans_xxx() を呼び出してロード済みとみなすようにしています。うーんこれはなぜだろう。初期化を遅延させているとコメントにはありますが…。

nobu: r48700 2014-12-03 17:13:26 +0900

encoding.c で rb_require_safe() を rb_protect() つきで呼んでいたのを、r48696 で切り出した rb_require_internal() を使うことでシンプルにしています。