ruby-trunk-changes r48470 - r48476

今日は const_set や instance_variable_set などのメソッドで不正な名前を渡した時の例外メッセージの修正の他、IO#write 系の長いバッファの書き込みの効率化などがありました。

nobu: r48470 2014-11-18 03:20:22 +0900

is_{local,global,instance,attrset,const,class,junk}_sym() という Symbol の type を取得する C-API を追加しています。 internal.h で宣言されているのでインタプリタ内部での利用のためです。 Symbol にはその文字列の表記によって type があり、ID の一部のビットで表現されているのですがそれを判定できるようにしています。なんとなくデバッグ用(デバッガでの確認用)のような気がします。

svn: r48471 2014-11-18 03:20:39 +0900

version.h の日付更新。

nobu: r48472 2014-11-18 03:23:09 +0900

Module#const_set, Object#instance_variable_set, Module#class_variable_set などで定数/変数名のチェックに失敗した時の TypeError のメッセージに含めるのがチェック結果の Qnil を渡してしまっていたので元の文字列/Symbol をメッセージに含めるようにしています。

nobu: r48473 2014-11-18 03:40:50 +0900

test/-ext-/symbol/test_inadvertent_creation.rb のテストメソッドを test_module_const_get から test_module_const_defined? を分離しています。

nobu: r48474 2014-11-18 06:08:23 +0900

r47913 の dynamic Symbol の管理方法の変更に追随して .gdbinit の rp コマンドで Symbol の type の表示方法を変更しています。

nobu: r48475 2014-11-18 10:38:50 +0900

r48472 でついでに追加した Module#const_set の例外メッセージのエンコーディングが保持される確認のテストが Encoding.default_internal に依存していたので EnvUtil.with_default_internal で UTF-8 に固定して実行されるようにしています。

akr: r48476 2014-11-18 18:10:59 +0900

include/ruby/io.h の FMODE_WSPLIT と FMODE_WSPLIT_INITIALIZED という FMODE を削除しています。ちょっとこんな実装があったの知らなかったのですが、 1.8 の時代のグリーンスレッド実装の時に write() でブロックしてプロセス全体が固まるのを防ぐために、IO が通常のファイルでなく、O_NONBLOCK でもない時にこの FMODE をセットして、一度に書き込むサイズを PIPE_BUF までに制限するようにしていました。今は write(2) を呼ぶのは GVL を開放した後なので、この制限は不要ということで削除されています。