ruby-trunk-changes r38071 - r38131

今日もたくさん変更がありました。まずデバッガ向けの機能で RubyVM::InstructionSequence(以下 ISeq と表記します) と TracePoint で任意の行にトレースのフックを有効にできる機能が追加されました。また既存の Proc や Method から ISeq を取り出す ISeq.of というメソッドも追加されました。また Queue, SizedQueue や ConditionVariable の実装の変更や非同期例外からの保護などもありまいた。その他 RubyGems の不具合修正もありましたが、このあたりはほとんど内容は読んでいません。

そして、今夜 Ruby 2.0.0-preview2 がリリースされました!
[ruby-dev:46677] [ANN] ruby 2.0.0-preview2 released
リリースに携わったみなさま、不具合修正や新機能実装に尽力されたコミッタのみなさまお疲れさまでした。 preview2 は preview1 から機能的にも性能的にもさらに大きな変更があります。是非試してみてください。

usa:r38071 2012-12-01 00:11:30 +0900

r38070 の再修正で、Windows では executable は .bat ファイルとしてインストールされるので、TestGemInstaller#test_check_executable_overwrite_other_non_gem でテストする条件は満たせないので Windows では実行しないようにしています。 [ruby-core:50388] [Feature #7427]

kazu:r38072 2012-12-01 00:16:03 +0900

r38066, r38071 の ChangeLog エントリの typo 修正。

ngoto:r38073 2012-12-01 00:57:21 +0900

拡張ライブラリ fiddle のビルドで FFI_STDCALL のチェックをこれがマクロ定数のつもりで書かれていたのに実際は enum 定数だったので、extconf.rb で存在チェックをして HAVE_CONST_FFI_STDCALL を定義してこれを使うようにしています。 [ruby-core:50398] [Bug #7483]

usa:r38074 2012-12-01 01:27:52 +0900

rubygems で gem ファイルのパスとバージョンを ":" で区切った文字列で表現してそれを split(":") で分割している処理があるのですが、ファイルパスに ":" が含まれている可能性があるのと Windows だとドライブレターとの区切り文字に必ず ":" が含まれているので誤動作するので、正規表現を使って末尾のバージョン番号っぽいものにマッチさせるように修正しています。 [ruby-core:50388] [Feature #7427]

usa:r38075 2012-12-01 01:51:11 +0900

gem ファイルを読み込むのに File.read を使っているのですが、gem ファイルはバイナリファイルなのでテキストモードで読み込むと Windows だと改行コードが変換されてしまうので、File.binread に変更しています。 [ruby-core:50388] [Feature #7427]

ko1:r38076 2012-12-01 02:00:30 +0900

RubyVM::InstructionSequence (以下 ISeq と略します)と TracePoint にデバッガ向けの新機能を追加しています。 ISeq#line_trace_all というメソッドで trace 命令のある行番号リストを配列で返すようにしています。そして TracePoint のイベントに :specified_line を追加して、ISeq#line_trace_specify でトレースのうち 0 からのインデックスで行を決めて(行番号じゃなくて line_trace_all が返したリストのインデックスで指定するようになっています)、第2引数に true/false を渡してそこに :specified_line イベントの TracePoint のハンドラの発火を on/off するようにしています。 デバッガが break を入れるための機能のようですね。あとは ISeq を取得する方法があればいろいろ遊べそうです。

usa:r38077 2012-12-01 02:11:11 +0900

rdoc のテストで ensure 節で一時ファイルの掃除を追加。また ensure で操作しようとしたファイルが存在しない場合のことを考慮(Windows だと skip されるテストなので begin ボディを実行せずに ensure に行ってしまうため)しています。 [ruby-core:50388] [Feature #7427]

kazu:r38078 2012-12-01 02:14:24 +0900

昨日の r38002 で不安だった dl のテストで子プロセスを起動するようにしたら require "dl" が必要なんじゃないというテストはやはり require "dl" が必要だったようで追加しています。なぜテストが通ってたかというと assert_in_out_err にブロック付きで呼び出してしまっていて、その場合 stdout, stderr のチェックの引数は無視されていたのでした。

kazu:r38079 2012-12-01 02:14:27 +0900

テスト用のユーティリティメソッド assert_in_out_err にブロックが渡されていたら test_stdout や test_stderr は無視されるので、何か値が渡されていたら例外を発生させて誤使用を防ごうとしています。

kosaki:r38080 2012-12-01 02:39:36 +0900

標準添付ライブラリ thread.rb の ConditionVariable#broadcast, signal, wait を Thread.async_interrupt_timing で非同期例外をマスクして Mutex の操作などの途中で抜けないようにしています。

kosaki:r38081 2012-12-01 02:39:48 +0900

Thread.async_interrupt_timing で引数のイベント種別のチェックを最初にして、不正な値をキーを渡していたらすぐに例外が発生するようにしています。

kosaki:r38082 2012-12-01 02:39:59 +0900

thread.c で rb_threadptr_interrupt_mask() と async_interrupt_timing_func() を呼び元の rb_thread_s_async_interrupt_timing() に展開して定義を削除しています。

drbrain:r38083 2012-12-01 02:54:00 +0900

r38075 で rubygems で gem ファイルを File.binread で読み込むようにしましたが rubygems には 1.8 互換性のために Gem.read_binary というメソッドがあるらしくこちらを使うように再修正しています。

drbrain:r38084 2012-12-01 02:59:06 +0900

rb_event_flag_t を int -> long に型を変更しています。詳しくはわかりませんが clang でコンパイルするとエラーになるそうです。と書いたもののコンパイルがエラーなのか実行時にエラーなのか。多分後者だと思いますけど。

ko1:r38085 2012-12-01 03:02:43 +0900

ISeq に path, absolute_path, label, base_label, first_lineno などの ISeq の情報を返すためのメソッドを追加しています。また ISeq.of というクラスメソッドに Proc や Method を渡すとその定義の ISeq オブジェクトを返してくれるようになっています! これで r38076 の specified_line イベントと組み合わせて定義されているメソッドなどの特定の行にフックをかけることができるようになりますね。
ささださんが日記に解説を書いてくださってます。 http://www.atdot.net/~ko1/diary/201212.html

ko1:r38086 2012-12-01 03:47:00 +0900

Thread.async_interrupt_timing の rdoc に改名された :never というタイミングの指定が残っていたので :defer に改名しています。

kosaki:r38087 2012-12-01 03:55:09 +0900

標準添付ライブラリ thread.rb の Queue と SizedQueue を ConditionVariable を使って再実装するように書き換えています。

kosaki:r38088 2012-12-01 03:55:18 +0900

r38087 の再修正。Thread.async_interrupt_timing でマスクする例外を RuntimeError にしていましたが、もっと広く StandardError を指定するように修正しています。

kosaki:r38089 2012-12-01 03:55:28 +0900

標準ライブラリ Sync の sync_synchronize と sync_lock を Thread.async_interrupt_timing で非同期例外をマスクして実行するようにしています。

naruse:r38090 2012-12-01 04:10:05 +0900

r38078 で dl のテストを修正したところで assert_in_out_err に第1引数に -W0 オプションを指定したのを環境変数 RUBYOPT の設定に変更しています。

naruse:r38091 2012-12-01 04:10:12 +0900

dl のテストの未使用のローカル変数の警告除去のため変数を削除しています。

naruse:r38092 2012-12-01 04:10:14 +0900

拡張ライブラリ dl の ext/dl/lib/dl/import.rb でインスタンス変数の未初期化の警告を除去。

naruse:r38093 2012-12-01 04:10:17 +0900

parse.y の未使用の構造体メンバやマクロを削除しています。

drbrain:r38094 2012-12-01 05:13:40 +0900

r38083 の ChangeLog のエントリに書いていたリビジョン番号が 間違っていたのを修正しています。

shirosaki:r38095 2012-12-01 07:29:13 +0900

64bit 版 Windows で SEGV していたのを修正。可変長引数を受け付ける rb_ary_new3() の引数なので VALUE に明示的にキャストしてバイト幅の違いで値が壊れるのを防いでいます。 [ruby-core:50258] [Bug #7456]

drbrain:r38096 2012-12-01 09:34:01 +0900

test/runner.rb で default_gem を読み込まないように GEM_SKIP に defs/default_gems に書いてある gem をセットしていたのを RubyGems 2.0 で default_gem が入って不要になった(もしくはむしろ害になっている?)ため空文字列をセットするようにしています。

drbrain:r38097 2012-12-01 09:42:36 +0900

rubygems が依存関係を記述したファイルを検索するのにカレントディレクトリ(この detect_gemdeps を実行している時点でのカレントディレクトリがどこなのかはわかりませんが)だけ探していたのをみつからなければルートディレクトリまで親ディレクトリを辿って探すようにしています。 ルートディレクトリまでいくのは行き過ぎじゃないのかなぁ。と思ったけどこれは各 gem 毎のファイルではないみたいですね。なんのためのファイルなんだろう……。Bundler の機能を取り込んでいるのかな。そういうことならルートディレクトリまで遡るのも理解できる(つまりプロジェクトのトップディレクトリに Gemfile があって、そのサブディレクトリでも同じ設定が影響する)。

drbrain:r38098 2012-12-01 09:49:20 +0900

rdoc のテストで Windows のドライブレターが大文字小文字を区別しないのを考慮してテストを修正しています。

tenderlove:r38099 2012-12-01 11:13:06 +0900

DTrace の変更。細かいところは読めてませんが cmethod-entry, cmethod-return という C 実装のメソッドの出入りのプローブが追加されています。あとは多分リファクタリングみたいなものではないかと思います。

nobu:r38100 2012-12-01 12:30:55 +0900

rubygems のテストで with_syck というメソッドで Syck を使うように設定しようとするところで警告を抑制するため一時的に $VERBOSE を nil にセットするようにしています。

kou:r38101 2012-12-01 12:35:36 +0900

r38053 で入って r38061 で revert された RubyGems のインストール時に default_gems を考慮する変更が再度入っています。 r38096 で変更した test/runner.rb のGEM_SKIP の設定がまずかったみたいですね。

nobu:r38102 2012-12-01 12:57:43 +0900

rdoc の Markdown 記法のパーサで "\r" を実際に文字列中に埋め込んでいるのをエスケープシシーケンスで書くようにしています。 tig で差分をみていたらどうにもおかしいと思ったら "\r" がそのまま行頭への移動として描画されていてその前の行が消えて見えてしまっていました。(git show は大丈夫だった)。

nobu:r38103 2012-12-01 12:58:39 +0900

追加されたファイルの svn property 変更。珍しく直前の r38102 だけでなく、かなり遡って過去に追加されたものも含まれているようです。また、ついでに ChangeLog の行末の空白除去もしています。

drbrain:r38104 2012-12-01 13:48:36 +0900

rubygems は $LOAD_PATH に各 gem の lib を追加するのですが、default_gems は標準添付ライブラリとしてインストールされているので追加しないようにしています。

nobu:r38105 2012-12-01 15:05:33 +0900

Dir.glob でディレクトリ名の長さを取得するのに strlen(3) だとだめで NAMLEN() を使うようにしています。 このため join_path() という関数に長さを渡す引数を追加しています。

nagachika:r38106 2012-12-01 17:08:19 +0900

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

nobu:r38107 2012-12-01 17:13:04 +0900

Emacs 用の misc/inf-ruby.el で compilation-shell-minor-mode が必要な変数をセットする前に呼ばれててちゃんと設定できていなかったので位置を移動しているみたいです。 [ruby-core:46518] [Bug #6742]

nobu:r38108 2012-12-01 17:17:05 +0900

Emacs 用の misc/ruby-electric.el の修正。詳細はスキップします。

kosaki:r38109 2012-12-01 17:28:44 +0900

標準添付ライブラリ thread.rb の ConditionVariable で待っている Thread のリストを管理するのに配列じゃなくて Thread をキーにした Hash を使うようにしています。はて、なぜでしょう。

kosaki:r38110 2012-12-01 17:28:56 +0900

コメントアウトされていた ConditionVariable#wait でのデッドロック検出のテストがコメントアウトされていたのを assert_in_out_err を使って子プロセスを使うことでテストできるようにしています。

kosaki:r38111 2012-12-01 17:29:09 +0900

test/ruby/test_thread.rb から ConditionVariable に関連するテストを test/thread/test_cv.rb に移動して、さらにテストを追加しています。

nobu:r38112 2012-12-01 18:15:54 +0900

r38111 で追加したファイルの svn property の設定。

nobu:r38113 2012-12-01 18:16:52 +0900

respond_to_missing? と initialize_{copy,clone,dup} を private なメソッドに変更しています。 [ruby-core:45395] [Feature #6539]

nobu:r38114 2012-12-01 18:16:57 +0900

逆に remove_instance_variable は private なメソッドでしたが public に変更しています。 [ruby-core:45395] [Feature #6539]

nobu:r38115 2012-12-01 18:17:02 +0900

Complex と Time の marshal_dump/marshal_load を private メソッドに変更しています。 [ruby-core:45395] [Feature #6539]

nobu:r38116 2012-12-01 18:30:24 +0900

gc.c の未使用変数のコンパイル時警告の抑制。

drbrain:r38117 2012-12-01 18:52:39 +0900

RubyGems 2.0 で複数の gem を cleanup で消す時にエラーが発生していた不具合を修正しています。詳細は未読。 [ruby-dev:46670] [Bug #7481]

nobu:r38118 2012-12-01 19:01:40 +0900

marshal.c の w_object, r_object0 から private に変えられたメソッド群を呼ぶために rb_funcall() を rb_funcall2() にする rb_respond_to() を rb_obj_respond_to() に変更するなど呼びかたを変更しています。 [ruby-core:45395] [Feature #6539]

nobu:r38119 2012-12-01 19:06:59 +0900

.gitignore に *.elc を追加しています。 emacs lisp のプリコンパイルしたファイルです。

nobu:r38120 2012-12-01 19:24:12 +0900

io.c の rb_io_puts() で再帰的に呼び出しする時に rb_check_array_type() で配列に変換した場合にその変換したオブジェクトを使ってしまうと rb_exec_recursive() で循環を検出するのに失敗して無限再帰に陥ってしまうので、変換できるかどうかの確認だけしたらその結果は使わず元のオブジェクトを再帰呼び出しに使うようにしています。またこのため io_puts_ary() の引数が配列じゃないことがありえるので rb_check_array_type() を呼ぶようにしています。 [ruby-core:42444] [Bug #5986]

ko1:r38121 2012-12-01 21:09:17 +0900

Thread::Backtrace::Location#inspect の定義を追加して to_s と同じ表示にするようにしています。

ko1:r38122 2012-12-01 21:19:52 +0900

r38121 で追加した Thread::Backtrace::Location#inspect のテストを追加しています。

nobu:r38123 2012-12-01 22:35:32 +0900

respond_to? の実装で respond_to_missing? を呼ぶ時に r38113 で private になったので rb_funcall2() を使うように対処しています。
って書いたのですが、rb_funcall() でも private メソッドを呼べるような気はするので効率を気にして変更なのかも。

nobu:r38124 2012-12-01 22:54:54 +0900

Time#_dump, _load などの rdoc を削って :nodoc: タグをつけたりしています。また respond_to_missing? の rdoc に内部的に呼ばれるものなんので直接呼ばないようにとコメントを追加しています。

nobu:r38125 2012-12-01 22:54:57 +0900

rubygems のテストで 1.9.2 でのみ実行するテストがあり skip が明示的な rspec の skip だったので、テストメソッド定義自体を消すようにして余計なメッセージを除いています。

nobu:r38127 2012-12-01 23:22:11 +0900

tool/make-snapshot で PATH_SEPARATOR を make のオプションに渡すようにしています。 id2token.rb が必要とするようになったそうです。

nobu:r38128 2012-12-02 00:25:28 +0900

コーディングスタイルの修正です。とみせかけて vm_trace.c の rb_tracepoint_new() で target_th を 0 で初期化していたのをカレントスレッドで初期化しています。これはミスだったようで後ほど r38131 でこの部分だけ revert されています。

nobu:r38129 2012-12-02 00:25:31 +0900

tool/gen_dummy_probes.rb が probes.h を生成する時に emacs 用のコメントを最初の行に置くようにして C モードで開くようにしています。

svn:r38130 2012-12-02 00:25:34 +0900

version.h の日付更新。

nobu:r38131 2012-12-02 00:26:52 +0900

r38128 で書いたようにおかしな変更が入っていたのを部分的に revert しています。