ruby-trunk-changes r33070 - r33078

今日は RubyGems 1.8.10 のマージ、autoload を thread safe にする修正、Time#to_s の返す文字列のエンコーディングの修正などがありました。

akr:r33070 2011-08-26 01:39:37 +0900

Time#strftime の rdoc で %Z と結果の文字列のエンコーディングについての追記がされています。 %Z だけは locale に依存するとのこと。また %Z は正確にタイムゾーン(offset)を限定する結果を返さないとか、OSによって挙動に差があるなどの問題点を指摘して %z を使用することを推奨しています。

svn:r33071 2011-08-26 01:39:41 +0900

version.h の日付更新。

kazu:r33072 2011-08-26 06:00:03 +0900

README* の行末の空白の削除です。

tenderlove:r33073 2011-08-26 08:24:33 +0900

Time#to_s で返す文字列がのエンコーディングが ASCII-8BIT になっていたので、US-ASCII にするようにしています。ただし Encoding.default_internal が特定のエンコーディングに指定されていたらそれに変換して返すようにしています。 [ruby-core:39092] [Bug #5226]

drbrain:r33074 2011-08-26 10:10:50 +0900

RubyGems の 1.8.10 をマージしています。 psych を gem でインストールしている場合にそちらを利用するようにする変更とか、gem uninstall で複数の gem パッケージを指定した時に途中で Gem::InstallError が発生すると残りの gem の uninstall が中断されてしまう不具合修正とか、Gem.dir が Gem.path より優先して探索されるようにする変更(多分 GEM_HOME と GEM_PATH のことかな?)、それから gem パッケージを生成する時に gemspec ファイルに文字列を埋め込む時に String#dump を使うようにしています。

なんか最近(RubyKaigi2011以降) RubyGems や RDoc のマージの時の commit log に変更点が簡単に書かれるようになったのですが、もしかしたら LT のおかげで「なんかコミット読んでるやつがいるらしーぜ」と認知されて気をつかってもらっているのかもしれませんね。ありがたいことです。

nahi:r33078 2011-08-26 19:27:20 +0900

Module#autoload によるスクリプトのロードが thread safe でない問題の対応です。このコミットは commit log がものすごく詳細に書かれているので、解説不要なくらいです。まあでも一応日本語の解説をしておくと、これまでは autoload が設定された定数は定数テーブルの中で Qundef という CRuby の内部で未初期化値として使っている定数(Ruby スクリプトからはこの値が見えることはないです)を未ロードを示すために格納していて、それをみて指定されたスクリプトを読み込むのですが、それを実行したスレッドが class/module 文で定数に Class/Module を格納したけどまだ class/module の定義が完全じゃない時に他のスレッドがそれを参照してしまう可能性がありました。そこで autoload の動作を開始したら Qundef をロード予約を意味する専用の値で置き換えて、ロードが完了するまではロードしている Thread しかその定数にアクセスできないようにしています。 [ruby-core:20797] [Bug #921]

多分 RB_GC_GUARD(load) の位置はもう少し下(ele を最後に利用した後)のほうがいいと思います。