ruby-trunk-changes r34895 - r34909

今日は正規表現での区切り文字(/regexp/ の "/" など)のエスケープの Regexp オブジェクトとしての扱いの変更や、st.c のリファクタリング、Syck の不具合修正などがありました。

ktsj:r34895 2012-03-04 22:59:23 +0900

hash.c のコメントの末尾の空白除去。

nobu:r34896 2012-03-04 23:21:13 +0900

正規表現エンジンに正規表現のソースを渡す時に、文法上の区切り文字(通常だと "/"。 %r リテラルを使うと他の記号にもなる)はエスケープしなくてもよいのにエスケープして渡していたので、そのまま渡すようにしています。Regexp.new("foo/") と /foo\// のようなリテラルで作った正規表現の同値性を保つための修正です。 [ruby-core:40364] [Bug #5484]

これにより、たとえば

%r*foo\**   # => これまでは /foo\*/ 最新版は /foo*/

のように %r 記法でデリミタに正規表現のメタキャラクタを利用した時にその中にそのメタキャラクタをエスケープして書いた時の解釈が変化するのでやや注意が必要です。 %r 記法使うのにわざわざその中で使うメタキャラクタをデリミタにするっていうのが若干いまいちなのでこれはこういうものということになるのではないかと思います。NEWS には書いたほうがいいかもしれませんね。

naruse:r34897 2012-03-05 10:16:19 +0900

Kernel#sleep のテストで CentOS 5.6 (Linux kernel 2.6.18) だと 4.99 sec で起きてきてしまうそうで、プラットフォームをみてチェックする時間の長さを調節しています。

svn:r34898 2012-03-05 10:16:23 +0900

version.h の日付更新。

naruse:r34899 2012-03-05 11:53:36 +0900

BigMath の rdoc から BigMath#log の記述を削除しています。 また String#byteslice の rdoc の typo を修正しています。 [ruby-dev:45307] [Bug #6112]

nobu:r34900 2012-03-05 12:43:45 +0900

st_table の packed 状態(numhash で要素数が少ない時に bins 配列に key, value の要素を配列で並べる使い方)から unpack する際に、デフォルトの bins 配列のサイズと pack 状態のサイズが一致しているのでそのままゼロクリアして再利用しているのですが、両者のサイズが異なるようになったらテーブルを確保しなおさなくてはいけなくなるので(今は同じ値になるように定義されていますが)、両者のサイズが異なる場合に st_realloc_bins() を呼ぶ実装を条件コンパイルして用意しておくようにしています。

nobu:r34901 2012-03-05 12:43:55 +0900

st.c で FIND_ENTRY(), PACKED_ENT() などマクロを利用して要素の検索やセットをするようにリファクタリングしています。

nobu:r34902 2012-03-05 12:44:05 +0900

struct st_table の宣言で pack された時に bins メンバを多義的に使いまわしていたのを union を使って big と packed とそれぞれ状態に応じて明示的に型(メンバ)を分けて利用するようにしています。その他変数名の変更などちょっとしたリファクタリング

nobu:r34903 2012-03-05 12:44:14 +0900

st_table のエントリを bins メンバの配列所定の位置に挿入する処理を add_direct() から new_entry() として切り出して、unpack_entries() で pack 状態のものを unpack する時に add_direct() に代わって利用するようにしています。 add_direct() にはサイズがしきい値を越えた時に rehash する処理があるのでそれを迂回しているという感じだと思います。

naruse:r34904 2012-03-05 16:36:47 +0900

r34897 の sleep のテストを調整するカーネルバージョンの条件を変更しています。しかし文法ミスがありすぐに再修正されています。

naruse:r34905 2012-03-05 16:40:51 +0900

regcomp.c の未使用の変数削除。

usa:r34906 2012-03-05 16:51:31 +0900

r34904 の文法エラー修正。またプラットフォームの判定にはまず PLATFORM を利用するようにしています(uname コマンドがないプラットフォームもあるので)。

nobu:r34907 2012-03-05 16:52:43 +0900

ext/socket/extconf.rb で String#sub の正規表現の後方参照に使っている々が間違っていたのを修正。

nobu:r34908 2012-03-05 17:11:48 +0900

Syck による YAML load 時に Exception (例外オブジェクト)をロードする時に YAML.object_maker というメソッドを使ってインスタンス変数に例外メッセージをセットするようにしていたのですが、例外クラスは内部的に "@" で始まらないインスタンス変数にメッセージを格納していて、これは Ruby スクリプトからは不可視で操作できないので、Exception#initialize を UnboundMethod として取り出して、これを allocate で確保したオブジェクトに UnboundMethod#bind で結び付けて呼ぶことでセットするようにしています。 initialize を独自に実装している例外クラスだとメッセージ以外の情報が初期化されていない例外になっちゃうかもしれませんが、とりあえず例外メッセージはセットされるようになります。

kazu:r34909 2012-03-05 18:29:24 +0900

r34896 でのテストのメッセージの typo 修正。