ruby-trunk-changes r36648 - r36653

今日は prepend と refine を合わせた時の不具合修正や YARV の実装の(特定のビルド条件での)修正などがありました。

tenderlove:r36648 2012-08-07 09:43:44 +0900

String#lines のテストにセパレータ($/)が分割する文字列そのものよりも長い文字列だった時のテストを追加しています。

usa:r36649 2012-08-07 10:48:36 +0900

File.expand_path のテストで長いテストメソッドを分割して複数のメソッドにするリファクタリングです。

shugo:r36650 2012-08-07 11:44:24 +0900

Module#prepend で Module を差し込まれた Class に refine で refinement 機能を使おうとすると、メソッドテーブルが RCLASS_ORIGIN() が指す IClass に移動しているのを考慮していなくて SEGV していた不具合を修正しています。

usa:r36651 2012-08-07 11:59:04 +0900

同じファイルを 2回 require しても1回しか読み込まれないことを確認するテストを追加しています。

ko1:r36652 2012-08-07 20:13:57 +0900

YARVVM 評価ループの実装方法にはいくつかあって、そのうち OPT_CALL_THREADED_CODE という各命令の処理を関数ポインタとして持っておいてそれを呼ぶという比較的素朴な実装の時の一番底のスタックフレームから抜ける時に値を返せなかった問題を修正しているようです。 direct threaded という方法だと各命令はループ*1内に展開されるのですが、 OPT_CALL_THREADED_CODE だと各命令が関数になるので leave 命令において return で VM のメインループから抜けることができないため未対応とされていました。 rb_thread_t::retval に戻り値を格納することで値を返せるようにしています。

naruse:r36653 2012-08-07 20:22:04 +0900

FreeBSD 9 上で Readline 6.2 とリンクした readline を使った irb で Ctrl-C で割り込みがすぐに効かないという問題があったため、 r36130 で一旦削除した変数設定のうち rl_catch_signals = 0; を復活させています。 [Bug #5423]

*1:実際にはループではなくて次の命令の処理のアドレスに直接ジャンプしたりするのですが