ruby-trunk-changes r33381 - r33400

今日は RubyGems の更新、ドキュメントの修正たくさん、Time.strptime の不具合修正、メモリリーク修正などがありました。

tenderlove:r33381 2011-10-04 05:49:19 +0900

psych で 1.9.3 から追加されている Time#strftime の "%:z" という指示子を利用したメソッドを 1.9.2 以前でも動作するように RUBY_VERSION で分岐して定義を分けています。psych は独立した rubygems パッケージもあるので共通化しているのでしょう。また Regexp::NOENCODING という定数も 1.9.3 から導入された(r30765)ものなので、定義されていなかったら psych で独自に定義するようにしています。

tenderlove:r33382 2011-10-04 06:00:50 +0900

Psych::Visitors::ToRuby.new と Psych::Visitors::YAMLTree.new の引数に ScalarScanner を指定できるようにしています。

tenderlove:r33383 2011-10-04 06:21:31 +0900

Psych::ScalarScanner で YAML浮動小数点数の記法の仕様(参考URL: http://yaml.org/type/float.html)に沿った正規表現を定義して切り出すようにしています。 YAML浮動小数点は "," や "_" で桁を区切ることができるみたいですね。また基数60(?)の記法というのが(":" で区切る)あるようです。
ところでここで

return Float(...) rescue ArgumentError

という文法を使っているのですが、多分これは

begin
  Float(...)
rescue ArguumentError
end

としたいのだと思いますが

begin
  Float(...)
rescue
  ArgumentError
end

になってしまいます(後置 rescue は捕捉する例外クラスを指定できない)。というわけで GitHub で psych に pull request を出してみました。

tenderlove:r33384 2011-10-04 06:31:43 +0900

psych 内部で YAML エンコートした文字列を得るために to_yaml を読んでいたところを yaml メソッドを呼ぶように変更しています。また to_yaml メソッドを定義していたところを yaml に変更(to_yaml は alias として残す)しています。これは YAML::ENGINE を変更された時に to_yaml が Syck のメソッドに切り替わってしまうのを避けるためだそうです。

tenderlove:r33385 2011-10-04 06:44:38 +0900

psych の gemspec ファイルを更新してバージョンを 1.2.1 -> 1.2.2 にアップデートしています。

drbrain:r33386 2011-10-04 07:15:47 +0900

RubyGems を 1.8.11 にアップデートしています。今回の変更は Deprecate というモジュールを Gem::Deprecate に移動しただけのようです。

drbrain:r33387 2011-10-04 07:31:25 +0900

Array[] の rdoc にあるサンプルコードに評価結果を # => のあとに追記しています。 [ruby-core:39052] [Bug #5215]

drbrain:r33388 2011-10-04 07:35:49 +0900

同様に Array.new の rdoc のサンプルコードにも評価結果を追記しています。 [ruby-core:39053] [Bug #5216]

drbrain:r33389 2011-10-04 07:43:59 +0900

Array.new の rdoc の英文の修正。サンプル(call-seq)の書きかたと first, second ... などの単語をそろえています。 [ruby-core:39645] [Bug #5344]

drbrain:r33390 2011-10-04 07:59:45 +0900

Proc#=== の rdoc 用コメント Proc#call の位置にあったのを正しい位置に移動しています。 [Bug #5349]

drbrain:r33391 2011-10-04 08:16:11 +0900

Proc#call の rdoc で Kerne.proc で作成した Proc オブジェクトは call メソッドで引数の数が一致しないと例外が発生すると書いてありましたが、これは間違いで引数の数をチェックするのは lambda かもしくは "->()" で作成した Proc オブジェクトの時です。

drbrain:r33392 2011-10-04 08:23:24 +0900

Shellwords の rdoc を整形して、サンプルコードを追記しています。 [ruby-core:39859] [Bug #5388]

drbrain:r33393 2011-10-04 08:33:57 +0900

Etc の rdoc 追記しています。 Etc.sysconfdir というメソッドは /etc じゃなくて /etc を返すんですね。 [ruby-core:39895] [Bug #5396]

naruse:r33394 2011-10-04 10:25:04 +0900

r33379 で追加した GC のパラメータを変更した時のテストで RUBYOPT 環境変数に -w などがついているとコマンドにオプションを指定しなくてもメッセージが出力されてしまうため RUBYOPT を空に上書きして子プロセスを起動するようにしています。

naruse:r33395 2011-10-04 11:44:55 +0900

同じく r33379 で -w などが指定された時のチェックを ruby_verbose の真偽でチェックしていましたが、これは VALUE 型で Qnil, Qfalse, Qtrue などが格納される可能性がある(このうち C 言語の偽、つまり 0 なのは Qfalse だけ)ため -W0 を指定すると Qnil になってメッセージが出力されてしまうということになっていたので、RTEST() マクロで真偽値をチェックするようにしています。
うわぁ、ごめんなさいごめんなさい。

nobu:r33397 2011-10-04 15:04:46 +0900

クラスオブジェクトを確保するところでオブジェクトをスロットから確保する前に rb_classext_t の構造体用のメモリを確保しているため、オブジェクト確保で例外が発生した場合に(メモリエラー?)メモリリークするので後に確保するようにしています。しかしこれだと今度は rb_classext_t の確保時に GC が走る可能性があって、ptr が NULL の struct RClass がマークされてしまって SEGV という現象が起きてしまいます。

naruse:r33398 2011-10-04 16:37:11 +0900

Time#strptime が UNIX時刻(1970/1/1 からの秒数)と "%s" 指示子を指定された時に誤った時刻を返す不具合を修正。 Date._strptime が :seconds を含むハッシュを返したら、 Time.at を使って時刻を作成するようにします。 [ruby-core:39903] [Bug #5399]

naruse:r33399 2011-10-04 18:44:08 +0900

r33397 が前述のような理由で SEGV を起こすため revert しています。

nobu:r33400 2011-10-04 21:10:09 +0900

というわけで r33397 のリベンジ。struct RClass の mark 処理時に rb_classext_t へのポインタが NULL だったらスキップするようにしています。