ruby-trunk-changes r36018 - r36035

今日も Process の exec/fork まわりのリファクタリングと、YARV のスタックフレームの構造のリファクタリングがありました。 YARV 愛好家は必見です。フレーム構造の解説は図が貼れるといいのですが……。

akr:r36018 2012-06-10 20:21:07 +0900

rb_fork_ruby() という rb_fork() の 第2引数以降にデフォルト引数を渡すショートカットを定義して、それを使うようにしています。

akr:r36019 2012-06-10 20:56:20 +0900

rb_fork_ruby() をさらに rb_fork_internal() を直接呼ぶようにしています。

akr:r36020 2012-06-10 21:13:33 +0900

rb_fork() の実装も rb_fork_err() を呼ぶのではなくて直接 rb_fork_internal() を呼ぶように変更しています。

akr:r36021 2012-06-10 21:31:40 +0900

rb_exec_err() を rb_exec_without_timer_thread() と改名して、rb_exec_err() をその関数を呼ぶだけのスタブとして定義しています。

yugui:r36022 2012-06-10 21:51:37 +0900

タイマースレッドがメインスレッドしかいなくて起こす必要がない時に休眠する処理を関数切り出しして、NativeClient 版のタイマースレッドの実装を select() と pipe を使わず単に pthread_cond_timedwait() を使うようにしています。
あと全体的に #ifdef .. #endif などの preprocessor directive の # の後をインデントを付けるようにしています。

yugui:r36023 2012-06-10 21:51:40 +0900

NativeClient 向けの configure の x86 環境での cpu 名 ARCH名の設定を修正しています。また必要な NativeCliend SDK のファイルが見つからない時にエラーになるようにしています。

ko1:r36024 2012-06-11 05:24:43 +0900

.gdbinit に rb_vmdebug_stack_dump_raw_current() を呼ぶコマンド SDR というのを追加しています。 VMデバッグ用とのこと。

svn:r36025 2012-06-11 05:24:47 +0900

version.h の日付更新。

naruse:r36026 2012-06-11 06:19:07 +0900

r36022 の #ifdef でのマクロの typo を修正しています。

naruse:r36027 2012-06-11 06:21:51 +0900

同じく pthread_attr_init() の返り値のエラーチェックしているところで err に代入し忘れている(エラー処理内で err を参照している)のを修正しています。

akr:r36028 2012-06-11 06:31:49 +0900

r35889 で削除した rb_proc_exec_n() と rb_proc_exec_v() を deprecated というコメント付きで復活させています。 intern.h に宣言が公開されていた関数なので互換性のために戻したってことでしょうか。

shyouhei:r36029 2012-06-11 11:57:02 +0900

compile.c や vm_backtrace.c で構造体の初期化に変数を含む記法や enum の宣言の最後に余分なカンマがあるなど C99 で拡張された記法を使っているところを修正しています。

ko1:r36030 2012-06-11 12:14:59 +0900

VM のスタックフレームの構造の変更が行われています。
コミットログにかなり詳しく書かれています。 YARV のスタックフレームの構造として、VM のスタック(マシンスタックとは別もの)にローカル変数(メソッドやクラス/モジュール定義ごとの変数スコープ)とブロック変数のための領域を指すためのポインタをそれぞれ(lfpdfp)持っていて、ローカル変数/ブロック変数はそこからのインデックス(オフセット)でアクセスしています。この lfpdfp は通常のメソッドの中では同じ位置を指していて、ブロックの中に入ると lfp は外側のローカル変数(そのブロックが置かれているメソッドやらクラス/モジュールの定義やトップレベル)の領域を指していて、dfp は今いるブロックのブロック変数のスコープを指していて異なるという状態になります。またブロックはネストできるので、dfpdfp[0] を辿ることで順に外側のブロック変数の領域を指して、最後に lfp と同じ位置を指すようになるという構造をしていました。この構造はささださんが図にしたものがあってこれをみると比較的わかりやすいと思うのですが、どこかに公開されているものはないでしょうか……。
このコミットでは、 lfpdfp をフレーム情報に両方持っていたものを、ep という1つのポインタにまとめてしまって、ep は dfp と同様にブロック内ではブロック変数の領域を指し、ep[0] を辿っていくことで lfp に相当するローカル変数の領域に辿りつけるので、これを LEP(local EP) と呼んで、LEP を判定するマクロ、取得するマクロを導入しています。
あとはデバッグ用に型(enum の導入などがあります)。
define_method にブロックを渡して定義したメソッドの場合の lfpdfp がややこしくて定数の探索とか? 微妙な問題があったような気がするので(dfp を辿っていっても lfp に辿りつかないとか? 確かそんなことがあったような気がする)これで良くなるかと言うと、このコミット自体は不要だった2つのポインタを1つにまとめる変更をしただけで基本的な構造には変化はないと思うのでそのあたりは今後のささだ先生の活躍に期待です。
[追記]ささださんの日記にも詳しい解説がありました。 http://www.atdot.net/~ko1/diary/201206.html#d11 [/追記]

naruse:r36032 2012-06-11 20:27:08 +0900

FreeBSD で execinfo.h を探すために /usr/local/include/execinfo.h を configure.in でベタ書きしていたのをやめて FreeBSDNetBSD (x86_64) の処理をまとめています。 FreeBSDコンパイルする人は --with-opt-dir か --with-execinfo-dir で /usr/local を明示的に指定しましょうとのことです。

akr:r36033 2012-06-11 21:37:55 +0900

process.c の rb_exec_fillarg() でコマンドラインの文字列を処理するうえでのメタキャラクタの説明をコメントに追記しています。

akr:r36034 2012-06-11 21:58:55 +0900

Time のテストにうるう秒の有無の影響を加味するように修正しています。

akr:r36035 2012-06-11 22:16:36 +0900

process.c の rb_proc_exec_n(), rb_exec(), rb_exec_err(), rb_fork(), rb_fork_err() は deprecated として宣言をマークするようにしています。コンパイラがサポートしていたら警告が出るようになるかも。