ruby-trunk-changes r32357 - r32367

今日は Yokohama.rb #10 の会場から更新です。 Array#rejet!, Array#delete_if のブロックの途中で break や例外などで抜けた時の配列の操作の修正がありました。

mrkn:r32357 2011-07-02 01:00:45 +0900

NEWS に r31695 での Bignum の乗算に Toom 3 というアルゴリズムを利用して高速化したことを追記しています。

svn:r32358 2011-07-02 01:00:49 +0900

version.h の日付更新。

mrkn:r32359 2011-07-02 01:59:58 +0900

NEWS ファイルに respond_to? が protected メソッドについて false を返すようになったという記述は現在は修正されているので削除しています。
コミットログと ChangeLog には r41837 で revert されたからと書かれてるのですが、まだそこまでリビジョン番号到達していないので間違いですね。

nobu:r32360 2011-07-02 07:17:46 +0900

Array#reject! や Array#delete_if のブロックを break で止めた場合に、それまでにブロックから真値を返して削除することになっている要素が消えない不具合を修正しています。rb_protect() を使って break などのフロー制御の時も配列の操作を行うようにしています。例外で抜けたり throw catch で大域脱出しても有効です。こういう不具合がまだあるんですねぇ。 [ruby-core:27366] [Bug #2545]
ただこの変更では途中で break しても、それより後の要素が残らなくなってしまうのはちょっと意外な気がします。テストは

a = [ 5, 6, 7, 8, 9, 10 ]
a.delete_if {|i| break i if i > 8; i < 7}
a # => [7, 8]

のようになっているのですが、こうすると a は [7, 8, 9, 10] になるのがいいように思います。「ブロックから true を返した要素を消す」からブロックから返ってなかったら消さないのかなぁと。

marcandre:r32362 2011-07-02 07:25:32 +0900

r32352 で Matrix#** の引数に Float や Rational を受け付けるようになったのにテストに Matrix#** に Float を渡して例外が発生することを確認しているものがあったので削除しています。

marcandre:r32363 2011-07-02 07:27:48 +0900

NEWS ファイルの非互換項目として Kernel#respond_to? の protected メソッドについての項目があったのも削除しています。

emboss:r32366 2011-07-02 09:03:29 +0900

openssl のテストで SHA-256 を利用するものは OpenSSL のバージョンが 0.9.8 未満だとサポートされていないので OpenSSL::Digenst::SHA256 が利用可能な時だけ実行するようにしています。 [ruby-core:37724]

mrkn:r32367 2011-07-02 10:02:39 +0900

r32359 で respond_to? と protected メソッドの挙動を revert したリビジョン番号として記述されていたのを r28564 に修正しています。