ruby-trunk-changes r44593 - r44621

今日はひさしぶりにたくさんのコミットがありました。 bigdecimal などのいくつかの gem 化されている拡張ライブラリの古い ruby バージョンへの対応や、IO の書き込みの writev(2) 利用、SizedQueue#clear の不具合修正などがありました。

nobu: r44593 2014-01-14 14:51:58 +0900

r44562 で拡張ライブラリ bigdecimal が利用しているビット数と10進数表記した時の桁数を取得するマクロを include/ruby/util.h に移動したのですが、bigdecimal は gem パッケージ化されているため、古い ruby でビルドしようとすることもあって、その時にコンパイルできないという問題がありました。 DECIMAL_SIZE_OF_BITS() が未定義だったら bigdecimal のソースにも自前の定義をもっておいてそれを利用するように対策しています。またフォーマット文字列で VALUE をそのまま埋め込む PRIsVALUE は 1.9 にはないので、こちらも例外メッセージの作成処理を PRIsVALUE が未定義の時の代替の実装も用意して古い ruby でも動くようにしています。 [ruby-core:59750] [Bug #9406]

nobu: r44594 2014-01-14 15:58:43 +0900

r44593 の続き。 拡張ライブラリ bigdecimal で PRIsVALUE が未定義の時の fallback のしくみを、例外発生のマクロの定義できりかえていたのを、クラス名の取得部分を CLASS_NAME() マクロで wrap するように変更しています。 [Bug #9406]

glass: r44595 2014-01-14 21:14:48 +0900

拡張ライブラリ thread に移植された SizedQueue で SizedQueue#clear を呼ぶとデータ追加で待たされていた Thread が起こされて追加できないといけないはずですが、Queue#clear を継承しただけだったのでデッドロックがおきる可能性があったので、書き込み待ちの Thread を全て起こすような実装を追加しています。 [ruby-core:59462] [Bug #9342]

naruse: r44596 2014-01-15 06:49:45 +0900

vm.c の nsdr() で警告除去のためのキャスト追加。

svn: r44597 2014-01-15 06:50:00 +0900

version.h の日付更新。

naruse: r44598 2014-01-15 10:25:28 +0900

拡張ライブラリ dl のテストで利用するための libc と libm のパスを FreeBSD の時の指定を追加しています。 FreeBSD 10 でファイル構成が変わったようです。

naruse: r44599 2014-01-15 10:43:29 +0900

拡張ライブラリ fiddle のテストでも利用する libc と libm のパスの指定を FreeBSD の時の指定を変更しています。

naruse: r44600 2014-01-15 10:46:03 +0900

さらに追加で dl と fiddle の FreeBSD のみで動くテストで dlopen に直接 libc のパスを記述しているテストでパスを修正しています。

naruse: r44601 2014-01-15 10:57:59 +0900

Process.setrlimit のテストで指定するサイズが小さいと FreeBSD で失敗するそうなのですが、FreeBSD 10 で必要なサイズが増えたらしくて、引数で指定するサイズも引き上げています。

nobu: r44604 2014-01-15 14:03:24 +0900

test/ruby/test_m17n.rb の test_utf_16_32_inspect メソッド内で各エンコーディングについてループしていたのをエンコーデング毎にテストメソッドを定義するように変更しています。

nobu: r44605 2014-01-15 14:03:49 +0900

String#inspect でダミーエンコーディング(UTF-16, UTF-32)の文字列の時に BOM 付きだったらこれを解釈して実際のエンコーディング(BE/LE 付き)を利用するようにしています……しかし元々そのような処理はあって、それを get_actual_encoding() に切り出しているようにみえるのでどこが修正されたのかぱっとわからないです。 [ruby-core:59757] [Bug #8940]
[追記]エンコーディングを index から取得する時に must_encindex() を呼び出す rb_enc_get_from_index() を使うようにしたことで、エンコーディングの autoload を利用するようにしたとのことでした。[/追記]

nobu: r44606 2014-01-15 14:04:36 +0900

String のメソッドで UTF-16, UTF-32 などのダミーエンコーディングで BOM を考慮していなかったので r44605 で分離した get_actual_encoding() を利用するようにしています。 [ruby-dev:47895] [Bug #9415]

nobu: r44607 2014-01-15 17:16:32 +0900

ext/fiddle/function.c のインデントの修正のみ。

nobu: r44608 2014-01-15 17:16:33 +0900

r44593、r44594 の再々修正で拡張ライブラリ bigdecimal の古いバージョンの ruby への対応として導入した CLASS_NAME() というマクロを RB_OBJ_CLASSNAME() へ改名しています。 また RB_OBJ_STRING() というマクロも定義しているのですがこちらはまだ利用されていません。はて?

nobu: r44609 2014-01-15 17:16:34 +0900

Integer の +, &, |, ^ などの演算子メソッドの引数(右辺)に Symbol を渡した時に coerce エラーになるのを確認するテストを追加しています。

nobu: r44610 2014-01-15 17:16:37 +0900

coerce のエラー時の例外メッセージを inspect 結果やクラス名を C の文字列を直接埋め込むのではなくて PRIsVALUE 指示子を使って VALUE のまま埋め込むことでエンコーディングを保持するようにしています。

nobu: r44611 2014-01-15 17:16:38 +0900

数値の変換用の関数で Float を変換しようとしてその型で表現できる範囲外だった時に例外を発生させる処理を out_of_range_float() およびマクロ FLOAT_OUT_OF_RANGE() として括り出すリファクタリング

nobu: r44612 2014-01-15 17:16:40 +0900

Numeric のインスタンスに特異メソッドを追加しようとした時に発生させる例外のメッセージ構築でも PRIsVALUE を使ってエンコーディングを保持できるようにしています。

nobu: r44613 2014-01-15 17:16:42 +0900

Numeric のインスタンスdup しようとした時の例外メッセージも PRIsVALUE を使ってエンコーディングを保持するようにしています。

nobu: r44614 2014-01-15 17:16:44 +0900

r44572 で拡張ライブラリでも PRIsVALUE を使うようにしたのですが、fiddle は gem パッケージとしても提供されているため 1.9 の ruby でもビルドできるように bigdecimal と同様に差異を吸収するためのマクロ RB_OBJ_CLASSNAME() と RB_OBJ_STRING() を追加しています。こちらは RB_OBJ_STRING() も利用されていますね。

nobu: r44615 2014-01-15 17:16:46 +0900

拡張ライブラリ json でも同様に 1.9 の ruby 対策として PRIsVALUE がなかった場合のマクロ定義をしています。

naruse: r44616 2014-01-15 17:26:52 +0900

標準添付ライブラリ rinda の RingServer のテストで TupleSpace 経由でコールバックが呼ばれるまで待つ処理が固まることがあるらしく 10秒のタイムアウトをしかけています。 Process.clock_gettime を使ってタイマーにしていますね。

nobu: r44617 2014-01-15 18:52:23 +0900

r44610 で追加した Numeric#coerce の例外メッセージのテストが default_external によって結果が異なるので EnvUtil.with_default_external を使って UTF-8 に固定してテストするようにしています。 また default_external が US-ASCII の時の assertion も追加しています。

glass: r44618 2014-01-15 20:37:23 +0900

IO の書き込み処理でシステムコール writev(2) が利用可能なら使って、保持しているバッファと渡された文字列の両者を一度のシステムコール呼び出しでまとめて処理できるようにしています。

nobu: r44619 2014-01-15 23:36:51 +0900

GC::Profiler.total_time のテストで結果が 0 より大きいことをチェックしていましたがタイマーの精度よりも短い時間で終わった時に 0 になることもありえるそうで 0 以上を OK にしています。

mrkn: r44620 2014-01-16 00:17:33 +0900

拡張ライブラリ bigdecimal のバージョンを 1.2.4 から 1.2.5 に更新しています。 ruby の古いバージョンへの対策を含めて gem パッケージを再リリースしたようです。 https://rubygems.org/gems/bigdecimal

svn: r44621 2014-01-16 00:17:37 +0900

version.h の日付更新。