ruby-trunk-changes r34956 - r34964

Enumerable::Lazy#flat_map の追加、st.c のリファクタリングなどがありました。

shugo:r34956 2012-03-09 14:34:41 +0900

Enumerable#lazy の返す Enumerable::Lazy に flat_map も遅延評価版のメソッドとして追加しています。

naruse:r34957 2012-03-09 14:52:18 +0900

IO#readpartial のテスト TestIO#test_readpartial_locktmp で IO#readpartial に読み込み先のバッファ用 String を渡していると読み込み処理中にその String を触ることで一時的 lock のチェックにひっかかって例外が発生することがあるのでそれを rescue しています。 もともとここのテストは別 Thread からバッファ用の String を破壊的に変更することで期待したバッファサイズでなくなっている場合に救済する処理のテストをしていましたが、IO#readpartial の場合は temporary lock を取得した状態で GVL を解放して fd の読み込み処理に入る(sysread はその前に読み込みできるデータがあるかのチェックで GVL 解放する)ので、このようなバッファ文字列の破壊的変更自体がエラーになっていたようです。 fd に O_NONBLOCK をセットしてブロックしないようにはしていましたが、それでも一瞬 GVL を解放する時があって、そこで触ると例外になるようです。 [ruby-dev:45296] [Bug #6099]

akr:r34958 2012-03-10 03:54:12 +0900

Time#strftime の指示子 %N の rdoc の精度(桁数)の説明を増やしています。

svn:r34959 2012-03-10 03:54:23 +0900

version.h の日付更新。

akr:r34960 2012-03-10 04:21:01 +0900

Time の rdoc の typo 修正しています。

ktsj:r34961 2012-03-10 22:33:16 +0900

enumerator.c の行末の空白を除去しています。

nobu:r34962 2012-03-10 23:52:06 +0900

st_table の numhash 型で pack された構造の時に要素を削除すると、配列から要素(キーと値のペア)を削除してそのうしろを詰め直すのではなく、削除済みであることを示す値(Qundef)を格納するようにして表現しているのですが、この時要素数を示す num_entries メンバを decrement するので、どこまで配列を利用済みかの情報が失なわれてしまっていました。どこまで利用済みかを示す real_entries メンバを追加して末尾の要素を失わないようにしています。

nobu:r34963 2012-03-10 23:52:19 +0900

pack 状態の st_table の要素でループする時に削除済みを指定するマーカをスキップする処理を組み込んだ st_foreach_check() という関数を追加し、tk などでコールバックでスキップするようにしていたのを st_foreach_check() を利用するように移行しています。

nobu:r34964 2012-03-10 23:52:30 +0900

これまで numhash 型の st_table だけ要素数が少ない時に pack するようにしていたのですが、全ての型で pack するようにしています。このため pack 時の要素の構造体にキーの hash 値を保持するメンバを追加しています。また、これとは直接関係ないような気がしますが pack 状態で利用する要素数の上限を 18 へ引き上げています。