ruby-trunk-changes r46461 - r46466

今日はおもに TracePoint の不具合修正、Method#curry メソッドの導入などがありました。

nobu: r46461 2014-06-19 13:42:16 +0900

Method#curry メソッドを追加しています。おおっ。 実体は既に存在している Proc#curry を利用していて、Method を Proc オブジェクトに変換してから Proc#curry でカリー化しているようです。また可変長引数のメソッドは curry の引数で arity を受け取っていくつ引数を受けとるか(何段階まで Proc を返すか)を指定できるようです。 [ruby-core:62212] [Feature #9783]

svn: r46462 2014-06-19 13:42:26 +0900

version.h の日付更新。

ko1: r46463 2014-06-19 18:17:21 +0900

rescue 節からの raise や throw などの大域脱出で TracePoint の b_return というブロックから抜ける時のイベントが発生してしまっていた不具合を修正しています。テストをみて気がついたのですが、メソッドから return で抜けるのも大域脱出なんですね。そう考えると特に rescue 節での return はありがちなパターンな気がします(もちろん再 raise もですが)。 VM Frame の種類に rescue 用のものを追加してブロック用のフレーム種類を使いまわしていたのをやめています。 [ruby-dev:48295] [Bug #9957]

ko1: r46464 2014-06-19 19:49:46 +0900

define_method で定義したメソッド(内部的に BMethod と呼ばれる)が引数の数などのチェックで ArgumentError が発生する時に、TracePoint で call イベントは発生するけど return イベントが発生していなかったので、どちらも発生しないようにしています。 [ruby-dev:48297] [Bug #9959]
へー、引数のチェックに失敗した時ってそのメソッドの call/return は発生しないんですね。まあ通常のメソッドだと引数チェックしてから frame を詰む(かな、違うかもしれない)からそういうものかも。

ko1: r46465 2014-06-19 21:43:48 +0900

TracePoint の c_return イベントが "-Numeric.new" のようにすると内部的に呼ばれている coerce メソッドからの戻りのぶんが発生しないという不具合を修正しています。 -Numeric.new は一例で、C 実装のメソッドからの大域脱出で cfp を巻き戻す時に起きる問題で、cfp を単に書き戻すだけでなくてちゃんと辿って rb_vm_pop_cfunc_frame を呼ぶようにしています。 [ruby-dev:48299] [Bug #9961]

nobu: r46466 2014-06-19 23:11:52 +0900

make install および uninstall のサブターゲット(っていうのかな?)のルールの依存関係に pre-install-xxx などの事前条件を満たすためのターゲットを追加しています。 並列 make 時の動作のためだそうです。