ruby-trunk-changes r43923 - r43935

今日は ARM など一部のアーキテクチャでの siphash の不具合修正や Enumerator#with_index の不具合修正などがありました。

nagai:r43923 2013-11-30 00:44:25 +0900

拡張ライブラリ tk の extconf.rb でビルドできる Tcl/Tk のバージョンのチェックの追加(8.6 が未サポートのため弾くようにしているそうです)や Tk::TkTable や Tk::TkMsgCatalog の不具合修正など。

a_matsuda:r43924 2013-11-30 03:13:34 +0900

標準添付ライブラリ drb の DRb::DRbSSLSocket の rdoc コメントの typo 修正。 currenly -> currently

nagai:r43925 2013-11-30 11:46:47 +0900

拡張ライブラリ extconf.rb で tclConfig.sh および tkConfig.sh を無視する時にその理由(バージョンの不一致または未サポートのバージョン)をメッセージに出力するようにしています。

nobu:r43926 2013-11-30 13:21:22 +0900

r43912 で Range の yield の処理を新規に追加した rb_yield_block() を使うようにしてブロック引数は渡せないようにした部分を revert しています。ただ元に戻したのではなくて rb_yield() のかわりに each_i() を直接呼ぶようにしています。 うーんいまいちよくわかりませんが、いずれにせよ Range#each で内部的に呼ばれる upto メソッドのブロックには(たとえなんとかして渡して呼んでみても)ブロック引数は渡されないようです。このテストコードを読むとブロックにブロックを渡して呼ぶややこしい方法がわかるので一読の価値があるかと思います。

nobu:r43927 2013-11-30 13:21:26 +0900

r43912 で追加した rb_yield_block() はブロック引数が渡されたら NotImplemented 例外発生でエラーにしていたのですが、Proc オブジェクトから rb_block_t を取り出して渡すように変更しています。あれ、渡せるようにするのか…。んー、これはどういう仕様変更になるんでしょうね。インパクトがよくわからない……。 ruby スクリプト上の yield では渡せないと思うのでこの変更の影響があるのは C API 経由の時だけだと思いますけど。

nobu:r43928 2013-11-30 13:28:15 +0900

Random の実装に使っている siphash.c の little endianアーキテクチャ(ARM で顕在化しているそうです)でのアライメントの不具合を修正しています。 [ruby-core:58658] [Bug #9172]

nobu:r43929 2013-11-30 16:25:17 +0900

enumerator.c の enumerator_with_index() でローカル変数のアドレスを Enumerator の経過情報に使ってしまっていたため関数から抜けると不正なアクセスをする可能性があったので NODE を生成してそれを利用するようにしています。以前も Enumerator か Lazy の複数のメソッドで同様の問題があって NODE を使うように書きかえたことがあった気がしますね。やっぱり Enumerator のような機能は C レベルからみると難しいというか、注意しないといけない点が多いですね。 [ruby-core:58692] [Bug #9178]

nobu:r43930 2013-11-30 17:46:41 +0900

ruby インタプリタの終了時の終了ステータスの値を決定するのを finalizer 処理の前に移動しています。 終了ステータスの決定時に例外オブジェクトなどで T_DATA のオブジェクトにアクセスする必要がある場合 finalizer 処理でこのオブジェクトが解放されてしまっているため SEGV する可能性があったみたいです。 [ruby-core:58643] [Bug #9167]

nobu:r43931 2013-11-30 18:05:45 +0900

VMデバッグ用関数 rb_vmdebug_debug_print_pre() の警告除去のための明示的なキャスト追加。

nobu:r43932 2013-11-30 18:05:48 +0900

拡張ライブラリ win32ole の hash2named_arg() という関数のプロトタイプ宣言が間違っていてビルド失敗していたのを修正。 r43910 でブロック用のコールバック関数の仮引数を宣言するマクロ RB_BLOCK_CALL_FUNC_ARGLIST() の導入時に対応漏れしていたようです。 [ruby-core:58710] [Bug #9184]

a_matsuda:r43933 2013-11-30 18:50:11 +0900

irb の rdoc コメントの typo 修正。 dependant -> dependent と binging -> binding

nobu:r43934 2013-11-30 21:22:17 +0900

キーワード引数とオプション引数(引数リストの最後の Hash による引数)の扱いのあたりのリファクタリングをしているようです。また rb_scan_args() でもキーワード引数のキーが Symbol であることをチェックするようにしています。

nobu:r43935 2013-11-30 21:22:20 +0900

Dir.open で知らないキーワード引数が渡されたらエラーにするようにしています。 正確にはキーワード引数ではなくてオプション引数(最後の引数が Hash)なだけなので知らないオプションを無視するのは当然だったわけですが、それをキーワード引数のようにチェックするようにしています。 r43934 のリファクタリングはオプション引数でもチェックできるようにするための布石だったわけですね。ただこれまで無意味なオプションを渡しても無視されてたので Hash オブジェクトを使い回して渡してたようなケースではエラーになるかもしれませんね。 [ruby-dev:47152] [Bug #8060]