ruby-trunk-changes r43905 - r43922

今日はブロック呼び出しのブロック引数の扱い関する C API の変更や case 文での "===" の暗黙の呼び出しを method_missing で対応しようとした時の不具合修正などがありました。

a_matsuda:r43905 2013-11-29 10:57:04 +0900

lib/racc/parser.rb の定数名 Racc_No_Extentions を Racc_No_Extensions に typo 修正しています。 :nodoc: タグがついてるので内部的な定数みたいです。

svn:r43906 2013-11-29 10:57:09 +0900

version.h の日付更新。

nobu:r43907 2013-11-29 11:26:48 +0900

メソッドに渡された C 実装のブロックを呼び出すコールバックの関数型 rb_block_call_func にブロック引数*1を渡せるように型を変更して、既存の xxxx_i() みたいな関数の引数を軒並追加しています。これ呼び出すところは既に渡していたのを受け取れるようにしているのでこれで壊れたりはしないでしょうけど、公開している型なのでこれを利用している拡張ライブラリでコンパイラの警告とかが出てしまうんじゃないでしょうか。この判定のために RUBY_BLOCK_CALL_FUNC_TAKES_BLOCKARG というマクロを 1 に定義しているみたいなので拡張ライブラリはこの定数をみて型を変更しろということなんでしょうけど……。

nobu:r43908 2013-11-29 16:45:00 +0900

r43907 で rb_block_call_func の型を変更したのに追随してさらにコールバック関数の引数を変更しています。

nobu:r43909 2013-11-29 16:55:11 +0900

include/ruby/ruby.h で rb_block_call_func_t を RB_BLOCK_CALL_FUNC_STRICT が真に定義されていない時は任意の引数を受け取る関数ポインタとして定義するようにして rb_block_call() でこれまでの定義と同じ関数が渡されても警告など出ないようにしています。なるほど。

nobu:r43910 2013-11-29 16:59:14 +0900

rb_block_call_func 型のコールバック関数の仮引数定義をする RB_BLOCK_CALL_FUNC_ARGLIST() という関数マクロを導入してコールバック関数の定義をこれを利用するようにしています。

nobu:r43911 2013-11-29 17:02:51 +0900

r43910 で導入した RB_BLOCK_CALL_FUNC_ARGLIST() で argv に const を付加するようにしています。またこれに追随して rb_block_call() や rb_check_block_call() などの引数や struct iter_method_arg の構造体メンバの型にも const をつけています。

nobu:r43912 2013-11-29 17:06:19 +0900

rb_yield_block() というブロック呼び出し時にブロック引数をチェックして渡されていたら NotImplemented 例外を発生させる関数を追加して rb_yield_block() からブロック起動する時はこれを使ってブロック引数が渡されてないかチェックするようにしています。Ruby スクリプト上の yield は現状文法的にブロック引数が渡せないので、拡張ライブラリから利用した場合のためのチェックだと思います。

sorah:r43913 2013-11-29 17:57:02 +0900

case 文で内部的に "===" メソッドを呼び出す時に method_missing による対応を考慮しておらず method entry が存在しないケースで SEGV していた不具合を修正しています。 r42869 によるデグレの修正。 なおコミットログと ChangeLog のチケット番号が間違っているようです。 [ruby-core:58606] [Bug #8872]

sorah:r43914 2013-11-29 18:08:33 +0900

r43913 の修正についてのテストを追加しています。

tarui:r43915 2013-11-29 20:45:40 +0900

RubyVM::InstructionSequence (以下 ISeq) の disasm の不具合修正。 inspect で struct RBasic::klass == 0 にして ObjectSpace から隠されているオブジェクトは rb_inspect() でエラーになるのでコピーを生成してから rb_inspect() に渡すようにしています。また不要だった関数の削除や NULL の可能性のある構造体メンバをチェックせず使っていた部分などを修正。

tarui:r43916 2013-11-29 21:01:18 +0900

RubyVM のデバッグ用の関数 rb_vmdebug_debug_print_pre() で VM の PC(プログラムカウンタ)を表示する時に cfp->pc から取得していたのを引数に受け取るようにしています。分岐命令の後などで cfp->pc は不正確な値になることがあるからとのこと。

a_matsuda:r43917 2013-11-29 23:03:26 +0900

標準ライブラリ webrick のエラーメッセージの typo 修正。およびテストでのメソッド名の typo 修正。 allowd -> allowed

a_matsuda:r43918 2013-11-29 23:43:01 +0900

標準添付ライブラリ uri の rdoc 用コメントの typo 修正。 arguement -> argument

nagachika:r43919 2013-11-30 00:21:38 +0900

r43913 の ChangeLog のチケット番号を修正。

svn:r43920 2013-11-30 00:21:43 +0900

version.h の日付更新。

kazu:r43921 2013-11-30 00:29:38 +0900

r43895 の ChangeLog エントリのインデント修正。

kazu:r43922 2013-11-30 00:29:41 +0900

r43883, r43915 および r43916 の ChangeLogtypo 修正。

*1:Proc オブジェクトを &blk のように '&' をつけて渡すとブロックとして渡される引数の渡しかたのほう。ブロックの |arg| のように || で囲まれたやつはブロックパラメータと呼ぶ