ruby-trunk-changes r38222 - r38236

今日は Refinement の実装方法の変更、IO での割り込みチェックのタイミングの変更、RubyGems の不具合修正、TracePoint#enable,disable の仕様変更、Ripper の不具合修正、public_send の不具合修正などがありました。

nobu:r38222 2012-12-06 01:07:27 +0900

public なメソッドしか呼べない public_send のテストを追加しています。

nobu:r38223 2012-12-06 01:10:41 +0900

protected メソッドが呼べるコンテキスト(同じ Class/Module のメソッド内)で public_send で protected メソッドを呼べてしまう不具合を修正しています。 [ruby-core:50489] [Bug #7499]

kosaki:r38224 2012-12-06 04:37:37 +0900

IO の書き込みの処理を行なう io_binwrite() で出力する前に割り込みをチェックすることで、出力処理する前に割り込みが優先して入るようにしています。 おもしろいのはテストで、Thread.async_interrupt_timing(:on_blocking) を使って確実に IO の前になるまで非同期例外が遅延されるようにしているので、この挙動のテストが書けるようになっています。Thread.async_interrupt_timing ができる前は非同期例外はメソッドの出入りなど全ての割り込みポイントで割り込まれる可能性があったのでこういうテストが書けなかったと思います。 Thread.async_interrupt_timing の使いどころはどんなことかなと思っていましたが、ruby のテストを書くのに便利なんですね!

kosaki:r38225 2012-12-06 04:37:49 +0900

Kernel#p で複数の引数を受け取った時に順に出力する間は Thread.async_interrupt_timing(:defer) で割り込みをマスクして実行しているような状態にするようにしています。 このために thread.c に rb_uninterruptible という関数を定義しています。宣言は internal.h なので外部からは使えませんけど。

drbrain:r38226 2012-12-06 07:20:15 +0900

細かい内容は確認していませんが、RDoc で ChangeLog フォーマットのパース結果の HTML をいい感じに変更しているようです。

ko1:r38227 2012-12-06 12:13:50 +0900

TracePoint#enable は既に enable な状態で呼ばれると例外を発生させていたのですが、無視して受け付けるようにしています。 TracePoint#disable も同様です。 [ruby-core:50561] [Bug #7513]

zzak:r38228 2012-12-06 13:57:20 +0900

r38227 で変更した rdoc 用コメントの typo 修正。

drbrain:r38229 2012-12-06 14:13:08 +0900

RubyGems の不具合をいくつか修正。
まず Bundler との協調の不具合修正があるらしいです。
それから default_gems の Gem::Specification#base_dir などが返すディレクトリやパスの位置が他のものと1つずれていて存在しないパスを返してしまう不具合の修正。 [ruby-core:50475] [Bug #7496]
またチケットの内容と一致しているのかよくわからないのですが、gem ファイルのキャッシュを保存するのをディレクトリに権限がない時はスキップするようにしています。 [ruby-core:50555] [Bug #7509]
また $SAFE=1 で Dir.pwd が tainted なために初期化処理でエラーになるのを回避(といっても untaint しているけどいいのか……)。

drbrain:r38230 2012-12-06 14:26:46 +0900

rubygems で文字列リテラルの連結("aaa" "bbb" が "aaabbb" になる)を利用しているところがあったのですが、これを廃止しようという動きがあったため明示的に String#+ で連結するようにしています。

drbrain:r38231 2012-12-06 15:20:50 +0900

rdoc には同じメソッドが重複して定義されているのを警告する機能があるようなのですが、"loading" 中は警告を出力しないようにしているそうです。でも loading 中というのがどいう状態のことを指しているのかよくわからないです。テストも単体テスト的なものみたいなのでここだけ読んでもわからないですね。誰か rdoc に詳しい人解説して頂けないでしょうか。

drbrain:r38232 2012-12-06 16:35:45 +0900

rake のテストで不要な rescue を削ったりといった細かい修正と、Rake::FileUtils.ruby で起動する ruby インタプリタの決定に環境変数 RUBY も考慮するようにしています。

nobu:r38233 2012-12-06 17:25:45 +0900

テストに使うメモリ使用量計測のライブラリで test/ruby/envutil.rb のメソッドを使っていたのですが EnvUtil の指定がなくて NoMethodError になっていたのを修正しています。 [ruby-core:50599] [Bug #7523]

nobu:r38234 2012-12-06 17:25:50 +0900

テストに出現する文字列リテラル内のヒアドキュメントの開始の記法が emacsruby-mode のハイライトを誤動作させるそうで文字列リテラルを分割したりしています。ここでまた文字列リテラルの連結を利用してしまってますね。

nobu:r38235 2012-12-06 17:29:16 +0900

標準添付ライブラリの Ripper で文字列リテラル内のヒアドキュメントの記法があってさらに #{} で式の埋め込みがあると改行からの文字列が消えてしまう不具合を修正しています。パース中にバッファ内にためていたものをが残ったままになってしまっていたので flush するようにしたという変更内容のようです。 [ruby-core:48703] [Bug #7255]

shugo:r38236 2012-12-06 22:08:41 +0900

r37993 の Refinement の変更を再度適用しています。 r37993 で SEGV が発生していたのはマシンスタック上に作られた method entry を rb_callinfo_t::me に保持させてしまっているところがあって不正なメモリアクセスになっていたためだったとのこと。今回は VM_METHOD_TYPE_REFINED 型の method entry はコピー元の method entry のコピーを保持するようにして、また Thread のマーク時に cfp->klass をマークするようにしています。 その他の変更は r37993 の時のコメントを参照してください。この時コミットラッシュだったのであまり読んでないですけど……。今日もコミットログだけみて書いてるので内容はいずれ読みたいところです。