ruby-trunk-changes r40698 - r40752

今日は盛り沢山です。
まず、2.0.0-p195 と 1.9.3-p429 がリリースされました。これは DL/Fiddle の taint チェックの追加という security fix を含むリリースです。また 2.0.0 系は最初のパッチレベルリリースであり、2.0.0-p0 の不具合修正などが多く含まれておりますので是非試してみてください。
http://www.ruby-lang.org/ja/news/2013/05/14/ruby-2-0-0-p195-is-released/
http://www.ruby-lang.org/ja/news/2013/05/14/ruby-1-9-3-p429-is-released/

それから trunk には RGENGC という世代別GC の実装が入りました。世代別 GC の導入により GC にかかる時間の軽減が期待されます。またこれにより Ruby 本体や拡張ライブラリでオブジェクト内部に触る方法の作法に変更があると思います。さらに YAML のライブラリである Psych に任意のオブジェクトをロードできない Psych.safe_load というメソッドが追加されています。これは JSON のように特定のクラスのオブジェクトのみロードできるようにすることで信頼できない文字列を読み込んで任意のコード実行される危険性をなくしたものです。

ko1:r40698 2013-05-14 00:55:09 +0900

RGENGC (世代別GC)の導入に向けて、struct RRational と struct RComplex のメンバーに const を付けて直接代入できないようにして、セット用の専用のマクロ RRATIONAL_SET_NUM(), RRATIONAL_SET_DEN(), RCOMPLEX_SET_REAL(), RCOMPLEX_SET_IMAG() を定義してこれを使うようにしています。 拡張ライブラリから直接 Rational や Complex の内部表現を触っていたライブラリはこの影響を受けてコンパイルできなくなる可能性があります。
セット用のマクロは先にバックポートして使えるようにして migration path を用意しておかないといけないかもしれませんね。

svn:r40699 2013-05-14 00:55:13 +0900

version.h の日付更新。

ko1:r40700 2013-05-14 01:34:25 +0900

GC::Profiler で GC にかかった時間を集計するために sweep にかかった時間をはかるタイマーが、Lazy Sweep によって小刻みに sweep が実行されるようになったのに追随しておらず不正確な値になっていたのを修正しているみたいです。あと構造体メンバの名称の変更など。

ko1:r40701 2013-05-14 01:52:49 +0900

r40700 で GC_PROFILE_MORE_DETAIL という GC::Profile の項目のデフォルト値を 1 にしてしまっていたので 0 に戻しています。また不正な構造体メンバのアクセスがあったのを修正。

ko1:r40702 2013-05-14 02:02:50 +0900

rb_objspace_t から marked_num というメンバを削除しています。 このかわりに objspace_live_num() を使えるので不要とのこと。

ko1:r40703 2013-05-14 03:07:47 +0900

そしていよいよ本丸、RGENGC が入りました。 [ruby-core:54621] [Feature #8339]
世代別GC とはなんぞやとか、後述の write barrier とはどういうことかとかは昨日の繰り返しになりますが「ガベージコレクションアルゴリズムと実装」という本を読むといいと思います。
差分は大きいので全て読んでいませんが、世代別GC を実装するためにオブジェクトの中身を触る時に write barrier が必要になるため、アクセス用のマクロを用意してそれを使うようにすることで write barrier の処理を挿入するポイントにしています。このため ruby 内部や拡張ライブラリを書く時の作法がかなり変わりそうです。

ko1:r40704 2013-05-14 03:14:01 +0900

r40703 では USE_RGENGC というマクロが off だったので RGENGC が有効になっていなかったので有効にしています。

ko1:r40705 2013-05-14 03:19:30 +0900

r40703 と r40704 の続きでさらに RGENGC_WB_PROTECTED_XXXX というマクロも on にして、各種オブジェクトの型の write barrier による保護を有効にしています。

ko1:r40706 2013-05-14 03:21:32 +0900

r40703, r40704, r40705 の続きで T_OBJECT 型のオブジェクトの write barrier による保護も有効にしています。

ko1:r40707 2013-05-14 03:22:17 +0900

さらに続きで T_STRING 型のオブジェクトの write barrier を有効にしています。

ko1:r40708 2013-05-14 03:23:35 +0900

さらにさらに続きで T_ARRAY 型のオブジェクトの write barrier を有効にしています。
これ1つずつ有効にしているのはなにか意図があるんでしょうか?

ko1:r40709 2013-05-14 03:34:10 +0900

r40703 で rb_str_new_frozen() で文字列が frozen 状態かどうかのチェックをするデバッグ用の分岐と rb_bug() の呼び出しが残っていたので削除しています。しかしこの後 assert(3) で落としているのでまだ rb_bug() のほうがいいような気もします。メッセージはともかく。

kazu:r40710 2013-05-14 09:37:39 +0900

r40702 および r40703 の ChangeLogtypo は不要な行の削除。

nobu:r40714 2013-05-14 10:54:48 +0900

gc.c と ChangeLog の行末の空白除去。

usa:r40721 2013-05-14 12:22:06 +0900

r40693 での Windows 環境での getipaddrs(3) のエミュレート関数で mingw ではマクロ _IFDEF_ が未定義なので条件コンパイルの条件を修正しています。よくわかりませんがコンパイルできなかったか実行時にエラーになったのだと思います。

nobu:r40722 2013-05-14 14:52:06 +0900

include/ruby/win32.h で INTPTR_MAX, INTPTR_MIN, UINTPTR_MAX が未定義の時に定義するようにしています。 コミットログによると VC9 でのビルド時に intptr_t と uintptr_t のみ定義されていて INTPTR_MAX, INTPTR_MIN, UINTPTR_MAX などが未定義だったのでそれをカバーするようにしているそうです。

nobu:r40723 2013-05-14 17:24:55 +0900

parse.y の is_global_name_punct() という関数の引数を char から int に変更しています。暗黙の型変換(promotion) を防ぐためとのことですがどういうことだろう。

nobu:r40724 2013-05-14 17:24:58 +0900

r40693 で getipaddrs() のエミュレートのために使っている iphlpapi というライブラリが古い VC で使えないということなのでエミュレート部分を _MSC_VER >= 1400 の条件で括って存在しないときは定義しないようにしています。

naruse:r40725 2013-05-14 17:42:58 +0900

r40684 で追加した Kernel#signleton_method について NEWS ファイルに追記しています。 [ruby-core:54914] [Feature #8391]

kazu:r40726 2013-05-14 18:15:33 +0900

r40722 の ChangeLog エントリの typo 修正。

nagachika:r40728 2013-05-14 20:06:58 +0900

DL と Fiddle で DL::Function#call や Fiddle::Function#call で関数を呼び出す時に引数に String を渡す場合にその String が taint で汚染されていた場合にチェックがされていなかったので、チェックを追加しています。 これは CVE-2013-2065 という脆弱性の修正になります。 http://www.ruby-lang.org/ja/news/2013/05/14/taint-bypass-dl-fiddle-cve-2013-2065/ 既に 2.0.0 および 1.9.3 のブランチにはバックポートされて、最新版リリースに含められています。

akr:r40735 2013-05-14 20:35:50 +0900

拡張ライブラリ socket の Socket::Ifaddr の rdoc コメントのサンプルのレシーバ名を修正しています。

nobu:r40738 2013-05-14 23:24:42 +0900

拡張ライブラリ socket の mingw でのビルドエラーを修正しています。 r40639 で追加した Socket.getifaddrs() のために使うマクロの存在チェックを追加しています。

nobu:r40739 2013-05-14 23:27:25 +0900

include/ruby/ruby.h で LONG_LONG 型が有効な場合の条件コンパイルの条件が間違っていて常に LONG_LONG が使えるように判定していたのを修正しています。 [ruby-dev:47341]

akr:r40740 2013-05-14 23:48:00 +0900

ext/socket/.document に 新規追加したファイル ifaddr.c を追記してドキュメンテーション対象に含めるようにしています。

usa:r40743 2013-05-15 00:44:14 +0900

signal.c に # include を追加しています。これがないと write(2) の宣言がなくて警告が発生するため -Werror を付けてコンパイルするとビルドエラーになるので追加しています。 1.9.3 でパッケージがビルドエラーになっていたのでその修正のため追加。

svn:r40744 2013-05-15 00:44:19 +0900

version.h の日付更新。

usa:r40745 2013-05-15 00:53:31 +0900

r40743 の ChangeLog エントリの typo 修正。

tenderlove:r40748 2013-05-15 01:58:50 +0900

ext/psych/lib/psych.rb の Psych.to_json の引数名を変更しているだけです。

tenderlove:r40749 2013-05-15 02:07:51 +0900

Psych のテストで test/ruby/envutil.rb のユーティリティを利用していたのですが、Ruby のレポジトリ内でないと使えないので同じようなユーティリティメソッド群を Psych::TestCase に定義して利用するようにしています。 psych は rubygems パッケージとしても独立して配布していて上流レポジトリが存在するので、そこでもテストできるようにしているのだと思います。

tenderlove:r40750 2013-05-15 02:26:41 +0900

拡張ライブラリ psych に Psych.safe_load という任意のオブジェクトを load しない安全な(信頼できない文字列を渡せる) loader メソッドを追加しています。デフォルトでは JSON のように真偽値、nil, 数値、文字列、配列、Hash などのみをロードできるようになっているようですが、Psych.safe_load の第2引数の whitelist_classes に Class の配列を渡すと、そのクラスのオブジェクトはロードできるようになるようです。
しかしこの変更で Psych::Visitors::YAMLTree#initialize の引数が省略不可能になってしまって rdoc のテストが大量に失敗しています。

nobu:r40751 2013-05-15 02:30:39 +0900

r40750 で追加された新規ファイルの svn property 設定。

nagachika:r40752 2013-05-15 03:28:13 +0900

r40668 の ChangeLog に truncate64() の関数チェックを削除したと書かれていましたが実際には削除されていなかったのでその記述を削りました。