ruby-trunk-changes r45174 - r45182

今日は文字列が既に Symbol になっているかを判定する Symbol.find というメソッドの追加や、デバッグモードでの例外発生時に SEGV することがあった不具合の修正などがありました。

kazu: r45174 2014-02-25 23:18:13 +0900

拡張ライブラリ dl と fiddle で NUM2INT() を使っていたところを型にあわせて NUM2SIZET() に修正しています。 Coverity Scan で検出したバグとのこと。

naruse: r45175 2014-02-26 01:34:00 +0900

文字列が既に Symbol になっているかどうかをチェックするメソッド Symbol.find(str) を追加しています。 Symbol は GC で管理されているオブジェクト群とは別にテーブルを持っているため、Symbol を作ると解放されないため、メモリ使用量を気にするとある文字列が Symbol になっているかどうかを知りたくなることがあるのですね。 [ruby-core:52267] [Feature #7854]

svn: r45176 2014-02-26 01:34:06 +0900

version.h の日付更新。

nobu: r45177 2014-02-26 09:43:46 +0900

rb_check_id() で引数が Symbol でも String でもなかった時の TypeError のメッセージを修正しています。 r45175 で Symbol.find が rb_check_id() を利用しているので直接利用されることができてきたのでメッセージも正確なものに修正したみたいですね。

nobu: r45178 2014-02-26 12:28:10 +0900

setup_exception() で r41598 でメッセージの構築に PRIsVALUE を使って直接 VALUE 型の変数を渡すようになったために不要になっていた RB_GC_GUARD() を削除しています。

nobu: r45179 2014-02-26 13:26:09 +0900

test/ruby/test_module.rb から指定した名前を返す inspect/to_s を定義した Module/Class を生成する labeled_module, labeled_class というユーティリティメソッドを test/ruby/envutil.rb の EnvUtil のモジュール関数として定義するように移動しています。

nobu: r45180 2014-02-26 13:26:23 +0900

setup_exception() で例外オブジェクトを文字列化する時に Ruby のメソッドを呼ぶのに rb_thread_t::errinfo を一時的に Qnil にクリアしておいて、そこで errinfo が上書きされた時にそなえて後で復旧させるようにしています。 -d オプションをつけて例外発生時のメッセージを出力するようにした時に SEGV することがあったそうです。 [ruby-core:61091] [Bug #9568]

nobu: r45181 2014-02-26 14:10:46 +0900

setup_exception() で警告メッセージを出力する warn_printf() でクラス名を埋め込むのにも PRIsVALUE を利用してエンコーディングを保持したまま出力できるようにしています。

ko1: r45182 2014-02-26 18:46:45 +0900

gc.c の heap_pages_free_unused_pages() で未使用のページをまとめている Tomb Heap のページ (heap_tomb->pages) が存在するかを最初にチェックすることで空きページがない時の処理をスキップするようにしています。もうひとつの hunk はいまいちよくわかってませんがこちらも途中でそれ以上の処理が不要になったらすぐにループを抜けるようにしているそうです。