ruby-trunk-changes r38324 - r38348

今日も Refinement と Module#prepend の併用時の挙動の修正、FreeBSD での C のバックトレース取得の追加、TracePoint のイベントフック内での例外の扱いの再変更、Dir.mktmpdir にチルダで始まる名前を渡した時の不具合修正などがありました。

ngoto:r38324 2012-12-12 00:24:31 +0900

拡張ライブラリ dl の DL::Function#ptr を追加して DL::Function#unbind で Fiddle を利用している場合のエラーを修正しています。 [ruby-core:50756] [Bug #7543]

svn:r38325 2012-12-12 00:24:35 +0900

version.h の日付更新。

ngoto:r38326 2012-12-12 00:44:22 +0900

dl のテストでコールバック付きの関数(DL::Function)を作成しているところで後始末として DL::Function#unbind を呼ぶようにしています。 コールバック数は MAX_CALLBACK まで(現在は5個? 意外にすくないですね)しか作れないので解放しておかないといけないみたいです。

naruse:r38327 2012-12-12 01:18:01 +0900

tool/make-snapshot で環境変数の BASERUBY, RUBY, MINIRUBY がそれぞれ --disable-gem オプションを受け付けるなら変数内に --disable-gem を含めるようにしています。 miniprelude.c の生成のための tool/compile_prelude.rb の実行時にビルドディレクトリの rbconfig.rb を読んでしまわないようにするための修正の一環だと思います。 [ruby-core:50736] [Bug #7541]

shugo:r38328 2012-12-12 01:48:21 +0900

Refinement の修正です。 Module#refine の中で Module#prepend した時の挙動の修正のため、生成した IClass のメソッドテーブルを元のモジュールからコピーする処理を追加しています。

naruse:r38329 2012-12-12 02:13:18 +0900

r38304 で revert した r38041 の $LOADED_FEATURES の内容を to_str で変換する処理は SEGV した時のバックトレース生成で呼ばなくする修正を再度入れています。ただし文字列を fprintf(3) で出力する時の文字列の長さの上限を 1024 から 128 に縮めています。 [ruby-core:49573] [Bug #7402]

nobu:r38330 2012-12-12 03:09:10 +0900

sample/test.rb に --verbose オプションを追加して、メッセージを --verbose をつけないと同じ行で表示する(改行しない)ようにしているみたいです。
また tool/rubytest.rb で CROSS_COMPILING という定数をチェックしているところで defined? で定義されているかどうかだけでなくその内容の真偽値もチェックしています。CROSS_COMPILING は通常 rbconfig.rb で定義されるみたいですね。

nobu:r38331 2012-12-12 03:45:43 +0900

TracePoint のイベントフック内で例外が発生した時に呼び元から例外が外に伝播するようにしています。 r38293 で例外はイベントフック内から漏れないようにしていましたが、例外が発生していたら TH_JUMP_TAG() を呼んで再発生させるように戻しています。そのかわり return のイベントフックで例外が発生すると無限ループ?が発生していたのに対応するためか、vm_exec() の VM メインループで rb_thread_t::tag のスタックを余分に積んで例外処理時に pop するようにしています。 一箇所 TH_POP_TAG2() を削除しているのはいいんでしょうか。あと rb_thread_t::tag のスタック(というか実体はリンクリストですけど)を1つ余分に積んでいるのに正常に処理が進んだ時に pop しなくていいんでしょうか。

naruse:r38332 2012-12-12 06:17:37 +0900

r38041, r38304, r38329 の一連のSEGV時の出力の修正の続きで、文字列の最大サイズを変更したのは効果がなかったらしく 1024 に戻して、fprintf(3) に %*s で長さを指定するフォーマットをやめています。

eregon:r38333 2012-12-12 06:44:49 +0900

Method#parameters や Proc#parameters が省略可能引数、rest 引数、キーワード引数を含む Method や Proc の場合に引数の個数の判定を間違えていて完全な情報が返っていなかったのを修正しています。 またメソッド定義についての rdoc 用コメントにキーワード引数とキーワードrest引数について追記しています。 [ruby-core:50735]
[Bug #7540]

naruse:r38334 2012-12-12 09:42:26 +0900

r38041, r38304, r38329, r38332 の一連の修正の続き。 今度は $LOADED_FEATURES の内容ではなくて rb_vm_t::progname を T_STRING であるかどうかチェックするようにしています。

naruse:r38335 2012-12-12 12:12:37 +0900

r38041, r38304, r38329, r38332, r38334 の続きで、stable fix とあるのでこれで決着みたいです。結局 vm_dump.c はたぶん元の内容に戻っていて、わざと自分に SIGSEGV を送信するテストで :rlimit_core (SEGV 時などに生成する core ファイルのサイズの制限)を0にするオプションを渡し忘れていたのを渡すようにしています。

nobu:r38336 2012-12-12 13:39:48 +0900

vm_insnhelper.c の vm_getivar(), vm_setivar() で条件コンパイルとプログラム上の if-else の組み合わせで重複していた文をまとめるリファクタリングをしています。

nobu:r38337 2012-12-12 13:40:55 +0900

attr_reader や attr_accessor で定義したインスタンス変数の取得メソッドが未初期化のインスタンス変数の初期化の警告を出力しないようにしています。正確には対象のオブジェクトが T_OBJECT 型の時(でかつインラインキャッシュを利用するようにビルドされていた時)は警告しないように分岐されていたのですが、特異クラスに定義された時に警告が出てしまっていたので修正しています。

drbrain:r38338 2012-12-12 14:16:53 +0900

RDoc で RDoc::ClassModule#documented? というメソッドを追加していて Class や Module の定義ごと非表示にすることができるのかなーというような感じがしますが、やはり単体テスト的なのがあるだけなので具体的な効果はよくわかりませんでした。
最近 RubyGems や RDoc の修正はまとめてじゃなくて個別に CRuby のリポジトリに入るようになりましたね(2.0 のリリースに向けて最新版をマージしたから追随しているんだと思いますけど)。まとめてマージされても分かんないなぁと思ってたけど個別に入ってもやっぱりよく読まないとわからないですね。

nobu:r38339 2012-12-12 16:06:14 +0900

r38236 で rb_method_entry_arity() の switch 文のブロックの範囲がずれていたのを修正しています。

nobu:r38340 2012-12-12 16:07:25 +0900

rb_method_type_t, method_optimized_type の enum の最後の要素の後にカンマがあったのを削っています。また NOEX_BIT_WIDTH、 NOEX_SAFE_SHIFT_OFFSET という定数名をつけて NOEX_??? の定数のビット幅やシフト量を定数化しています。
それから rb_method_type_t という enum の最後に VM_METHOD_TYPE__MAX を追加して rb_method_type_t の値による switch 文に VM_METHOD_TYPE__MAX のケースを追加しています。これって何か意味があるんでしょうか? もしかして追加する時に末尾じゃないところに追加すれば差分が1行ですむから最後の要素を作っておく & switch 文で enum の値は全て書いておかないと警告になることがあるからというだけだったりして。

nobu:r38341 2012-12-12 16:08:06 +0900

rdoc のテストで character device file として File::NULL を使うようにしています。

naruse:r38342 2012-12-12 16:36:32 +0900

configure で libexecinfo をリンクする場合はコンパイラオプションに -fno-omit-frame-pointer を付加するようにしています。最適化でスタックフレームポインタを消さないようにしないと FreeBSD では C のバックトレースの取得でエラーになるそうです。 そして r29982 で (2010年11月30日 なので結構昔ですね) FreeBSD では最適化が効いている時にはバックトレースの取得をあきらめていたのを消して、晴れて FreeBSD でも最適化されたビルドでバックトレースが取得できるようになったようです。

nobu:r38343 2012-12-12 18:27:12 +0900

time.c でタイムゾーンの文字列を zone_table という static な st_table で管理していて、その検索と追加を st_lookup() & st_add_direct() していたのを st_update() で 1度の検索で行うようにしています。

shugo:r38344 2012-12-12 18:35:50 +0900

Refinement の修正です。 Module#prepend した時にその Class/Module の IClass を作ってメソッドテーブルをその IClass に移動するのですが(prepend した Module のメソッドのほうを優先して探索するため)、その時に refine されたメソッドはやっぱりオリジナルの Class/Module のメソッドテーブルに残す(再移動する)ようにしています。 Refinement で変更されたメソッドは prepend したモジュールのメソッドよりも優先するようです。
ということは refine で変更したメソッドの中で super すると prepend したモジュールのメソッドが呼ばれるんですね。というか、今更ですけど refine したメソッドから super すると refine で上書きしたメソッドがもともと定義されていたらそれが呼ばれるんですね。これってそういう仕様なのでしょうか。

naruse:r38345 2012-12-12 19:06:29 +0900

Process.spawn のテストで spawn に長い文字列を渡すと "too long path" という警告が出るので EnvUtil.suppress_warning を使って警告を抑制しています。

naruse:r38346 2012-12-12 19:51:49 +0900

拡張ライブラリ json の 1.7.5 を upstream からマージしています。
Time オブジェクトの JSON 化の時の nanosecond の表現の取得方法の微妙な変更とか JSONError に JSONError.wrap で別の例外の情報を内包して生成することができるようにしたといったちょっとした変更とテストの追加があったようです。

nobu:r38347 2012-12-12 19:56:24 +0900

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

nobu:r38348 2012-12-12 21:40:51 +0900

標準添付ライブラリ tmpdir.rb で Dir.mktmpdir に "~" (チルダ)からはじまる名前をわたすと続く文字列をユーザ名としてそのホームディレクトリとして展開しようとしてしまうのを、チルダのままファイル名の一部として使うように修正しています。 tmpdir とファイル名を繋げて絶対パス化するのに File.expand_path を使ってしまっていたので解釈されてしまっていたので、単に File.join で繋げるだけにしています。 [ruby-core:50793] [Bug #7547]