ruby-trunk-changes r45693 - r45711

今日は LazySweep している状態で Symbol GC のための Symbol の検索が死んだ(死につつある) Symbol オブジェクトを取り出してしまう不具合についての修正や、tmpdir.rb で require "etc.so" するところの例外捕捉をやめる変更などがありました。

naruse: r45693 2014-04-24 05:59:03 +0900

r45492 の rb_str_dynamic_intern() の修正と同様に SymbolGC の導入時に LazySweep で mark されなかったけどまだ sweep されていない Symbol を見てしまうことを考慮して dsym_node_gen() でも rb_gc_resurrect() でみつけた Symbol を復活させるようにしています。

svn: r45694 2014-04-24 05:59:09 +0900

version.h の日付更新。

nobu: r45695 2014-04-24 09:35:34 +0900

File::Statfs#inspect を追加してメンバの情報を表示するようにしています。

naruse: r45696 2014-04-24 10:01:18 +0900

r45683 で File#seek の SEEK_HOLE/SEEK_DATA に対応しているかのチェックで `uname -r` の結果をチェックしているところで文字列のまま数値と比較しようとしていたので to_i で整数化して比較するように修正しています。

nobu: r45697 2014-04-24 11:04:29 +0900

r45492 で mark されなくて sweep 前の Symbol を使ってしまうのと rb_gc_resurrect() を呼ぶ修正の条件分岐を !STATIC_SYM_P(sym) でなくて ID_DYNAMIC_SYM_P(id) を使うようにしています。少し効率的にしているそうです。

nobu: r45698 2014-04-24 11:04:33 +0900

r45693 の dsym_node_gen() での rb_gc_resurrect() は revert して rb_pin_dynamic_symbol() で Symbol を pin down する時に復活させるように移動しています。

naruse: r45699 2014-04-24 11:16:38 +0900

r45492、r45693、r45698 の Symbol GC と LazySweep の組み合わせで sweep 予定の Symbol を復活させる修正についてのテストを追加しています。

nobu: r45700 2014-04-24 11:21:38 +0900

同じく Symbol GC がらみで rb_sym2id() と rb_sym2id_without_pindown() で渡された VALUE が Symbol じゃない時に 0 を返すようにしています。はて? "for the time being" (差し当たりは) ってあるので、おそらくどこかに不具合があってここで Symbol がくるはずなのに来てないことがあるから work around としてやってるってことではないかと思います。

nobu: r45701 2014-04-24 11:53:29 +0900

拡張ライブラリ openssl の OpenSSL::ASN1.new の第3引数 tagging に Symbol でない値を渡すと SYM2ID() を呼んでしまっていたのでチェックしてから呼ぶように修正しています。 r31699 の修正ということですが 2011年のコミットなので現行のバージョンは全て影響しそうですね。 [ruby-core:62142] [Bug #9771]

nobu: r45702 2014-04-24 12:08:49 +0900

r45700 の rb_sym2id() や rb_sym2id_without_pindown() で Symbol 以外の VALUE が渡された時の挙動を 0 を返すのではなくて TypeError 例外を発生させるようにしています。

nobu: r45703 2014-04-24 13:24:56 +0900

lookup_id_str() のところで渡された Symbol (id) とその参照する fstring も rb_gc_resurrect() で復活させるようにしています。

naruse: r45704 2014-04-24 17:46:56 +0900

r45695 で追加した File::Statfs#inspect の実装でフォーマット文字列のバイト幅を指定する修飾子を修正したり明示的なキャストを追加して警告除去しています。

naruse: r45705 2014-04-24 17:47:29 +0900

同じく r45695 で追加された File::Statfs#inspect のテストで assert_match のメソッド呼び出しをかっこつきにして警告除去。

naruse: r45706 2014-04-24 17:47:47 +0900

File#seek の SEEK_DATA のテストで不要になったローカル変数を削除して警告除去しています。

akr: r45707 2014-04-24 20:53:31 +0900

標準添付ライブラリ tmpdir で拡張ライブラリ etc を require しているところを begin .. rescue LoadError で囲んで etc がビルドされなかった場合を考慮していたのをやめています。 r45692 で常に etc をビルドするようにしたので不要になったということでしょう。けどここ "etc.so" と拡張子が決め打ちで書かれているので特定の環境のみっぽい…と思いきや Mac OS X では require "etc.so" でもちゃんと etc.bundle がロードされるので ".so" は拡張ライブラリを指定する拡張子として扱われてるみたいですね。ちょっと load.c を覗くと、".so", ".o" と RbConfig::CONFIG["DLEXT"] がどれも拡張ライブラリを明示的に指定するために使えるようなので環境によらず ".so" は使えそうですね。

kazu: r45708 2014-04-24 21:11:01 +0900

man ruby に記述されていた contributor 一覧の Wiki のリンクが古くなっていたので修正しています。

akr: r45709 2014-04-24 22:40:18 +0900

r45707 の tmpdir.rb の require "etc.so" の例外についてと関連していると思いますが bootstraptest/test_io.rb で tmpdir で追加される Dir.tmpdir を利用していたのをやめて "/tmp" 固定にしています。make test は miniruby で動き、拡張ライブラリはロードできないからだろうと思います。

akr: r45710 2014-04-24 22:54:07 +0900

r45709 を revert しています。一時ディレクトリを /tmp に固定してしまったのは、特に Windows 環境ではよくなかったので別の対策を次で打ってます。

akr: r45711 2014-04-24 22:56:09 +0900

bootstraptest/test_io.rb で require "tmpdir" する前に $" ($LOADED_FEATURES) に "etc.so" をつっこむことで lib/tmpdir.rb の require "etc.so" がエラーにならないようにするハックで miniruby で tmpdir.rb を利用できるようにしています。ちなみに Windows では環境変数 TEMP があるのでそれから取得するように tmpdir.rb が実装されているので、ポータブルに一時ディレクトリを得たい場合は tmpdir.rb の Dir.tmpdir を使うのが正解だそうです。