ruby-trunk-changes r51868 - r51883

今日は XFS での Dir#glob のディレクトリ誤判定の修正と Module#private_constant などが freeze された Module/Class でエラーを返すようにする変更などがありました。

kosaki: r51868 2015-09-16 04:23:43 +0900

test/ruby/test_thread.rb の Mutex#synchronize のテストで Mutex#synchronize のブロック内で 100.times{} のからっぽのループを置いて割り込まれやすいようにして、それでも一貫性が保たれることを確認するようにしています。 while ループが使われていて、また r += 1 だと最適化が効いて opt_plus 命令によってメソッド呼び出しが起きずに VM が直接加算してしまうというのもあってこのループ実行中に割り込まれないようになってたっぽいですね。 [Bug #11496]

svn: r51869 2015-09-16 04:24:47 +0900

version.h の日付更新。

kosaki: r51870 2015-09-16 12:19:53 +0900

ファイルシステムが xfs の時の readdir(3) が返す struct dirent の d_type が directory と directory に対する symbolic link で DT_UNKNOWN を返すため Dir#glob の再帰の判定にミスがあったのを修正しています。 r49966 で readdir(3) で sturct dirent::d_type を見ることでタイプがわかるということを利用して lstat(2) の呼び出しを抑制する最適化をしていましたが、DT_UNKNOWN が返された時にはこれを見ないで lstat(2) を呼んでその結果を利用するようにしています。

usa: r51871 2015-09-16 13:24:31 +0900

doc/syntax/literals.rdoc に ?a のようなリテラル(1.8 までは数値、1.9 からは1文字の文字列を返すようになりました)について追記しています。? ってコントロール文字にも使えたんですねぇ。どこかでちらっと見たことあったような気もするけど。

nobu: r51872 2015-09-16 14:31:26 +0900

r51871 のドキュメント追記の typo 修正。

nobu: r51873 2015-09-16 14:50:00 +0900

String#setbyte で 1byte の値を書きかえた時に coderange の情報を調べて、変更が必要ないかをチェックして壊れてしまっていたら ENC_CODERANGE_BROKEN をセットしたり、ENC_CODERANGE_CLEAR() で次に必要になった時に取り直すようにしたりしています。

knu: r51874 2015-09-16 15:03:18 +0900

doc/syntax/literals.rdoc に "..." による文字列リテラル内で利用できるエスケープ文字について追記しています。

knu: r51875 2015-09-16 15:16:15 +0900

r51871 の doc/syntax/literals.rdoc の ?a 記法のリテラルの説明に例を追加して、文字列リテラル内のエスケープ文字の説明とからめた説明に変更しています。

nobu: r51876 2015-09-16 15:21:13 +0900

r51874 の doc/syntax/literals.rdoc の文字列リテラル内のエスケープ文字の説明に \c (7Fh, DEL) を追加しています。

knu: r51877 2015-09-16 15:31:39 +0900

r51874 の doc/syntax/literals.rdoc のエスケープ文字の説明の \0 は8進数記法でない場合のみ(つまり 0-7 の文字が続かない時のみ) NUL 文字として扱われる点を追記しています。なるほど、 "\0" と "\00" と "\000" はみな同じ NUL 文字1文字の文字列になりますね。で、 NUL 文字 + "1" という2文字(byte?)の文字列が欲しい時は "\01" とか "\001" とは書けず "\0001" とか "\x001" とか "\u00001" などと書かないといけなくて、非常に読みづらいですね(0 の個数3回くらい数え直した)。これって TRICK のネタになりませんかね?

knu: r51878 2015-09-16 15:58:56 +0900

r51874 で追加して r51877 で説明追加した "\0" という記法ですが、これは 8進数表記の一種であって独立した特別な記法ではないとして説明を削除しています。

nobu: r51879 2015-09-16 17:15:58 +0900

include/ruby/ruby.h の struct RBasic::flags のビットフラグの定数に RUBY_FL_PROMOTED0 と RUBY_FL_PROMOTED1 の mask RUBY_FL_PROMOTED を追加(復活?)しています。 .gdbinit のためと書かれていて、.gdbinit で定義している rp で利用してたみたいですね。

nobu: r51880 2015-09-16 17:18:02 +0900

昨日の r51867 でちょっと書いてましたが、Windows の時に socket の管理で云々、というのはもう関係なくなってて、その前にやっていた組み込みエンコーディングの比較のオブジェクト生成不要にした変更により Windows でも ENABLE_VM_OBJSPACE を真にしても大丈夫になったようです。このため常に ENABLE_VM_OBJSPACE を 1 に定義するようにしています。

nobu: r51881 2015-09-16 20:39:29 +0900

Module#private_constant, #public_constant, #deprecate_constant などの定数の visibility (っていうのかな)を変更するメソッドで freeze されているかどうかをチェックするようにしています。 [ruby-core:70828] [Bug #11532]

suke: r51882 2015-09-16 20:53:50 +0900

r51861 で internal.h から分離された encindex.h の #endif のコメントの typo 修正。

nobu: r51883 2015-09-16 21:14:52 +0900

r51880 での Windows での ENABLE_VM_OBJSPACE を 1 に定義する変更を revert しています。今度は起動時の初期化ではなくて、終了時の exit_handler() での socklist と conlist の解放がオブジェクト管理の終了後に行われるためにやっぱり問題があったようです。単に revert したのではなくて #define しているところのコメントもそれにあわせています。