ruby-trunk-changes r37409 - r37429

今朝 ruby 2.0.0-preview1 がリリースされました。来年リリース予定の 2.0.0 の最初の preview 版です。(ruby-dev でのアナウンス)
まあつまり今朝時点での trunk からリリースされているわけでほぼ trunk なのですが、この機に試してみてください。
今日はrefinement の機能追加(Symbol#to_proc の refinement 対応など)や define_method でトップレベルメソッド定義できるようにするメソッド追加、Array の比較の高速化などがありました。

naruse:r37409 2012-11-02 03:22:31 +0900

Ruby のリリースパッケージを作るためにアーカイブファイルを作ったりする作業をするためのツールが preview のタグに対応していなかったので正規表現の修正をしています。

naruse:r37410 2012-11-02 03:24:39 +0900

lib/mkmf.rb に config["libdir"] が nil の時にエラーになっていたのでチェックを追加しています。ちなみに '&&' と 'or' は優先順位が違う(and, or は優先順位が最低)ので、先に a && a[...] or c は (a && a[...]) or c と解釈されるので意図した通りに動きます。

naruse:r37412 2012-11-02 04:24:21 +0900

バックポート用のツール tool/merger.rb に preview, rc(release candidate) のタグを打つ機能を追加しています。

nobu:r37413 2012-11-02 04:40:15 +0900

r37404, r37405 あたりで問題になった Process.exec のテストで存在しないファイルとして /nonexistent を使っていたけど実際にファイルがあったという問題を軽減するため /nonexistent ではなくて ./nonexistent を使うようにしています。一時ディレクトリを作成して実行しているので相対パスなら絶対ファイルはないはず、ということみたいです。

nobu:r37414 2012-11-02 04:41:38 +0900

mkmf.rb でビルド時の依存関係のために作るタイムスタンプファイル名の置換するための文字に % を使っていたのを ! にしています。 % は GNU Make の特殊文字だったからだそうですが、! は nmake の特殊文字だったようで後に r37426 あたりで再修正しています。

naruse:r37415 2012-11-02 04:48:34 +0900

thread.c の rb_thread_io_blocking_region() で利用されない可能性がある変数(大域脱出で抜けることがある)が初期化されていなかったためコンパイラが未初期化のまま参照される可能性があると警告を出すので Qundef で初期化しています。実際には使われる場合には代入されるのですが、コンパイラがそこまでは検出してくれないので。

nobu:r37416 2012-11-02 08:23:23 +0900

load の第2引数に true を指定して無名モジュール内で評価している時のスクリプトで include を実行した時の警告メッセージの表記を少し修正しています。
と、思うのですが ruby -we 'load "a.rb", true' として a.rb で include Math などとしても警告が出力されないので、警告の出る条件を何か勘違いをしているようです。

nobu:r37417 2012-11-02 08:24:33 +0900

トップレベルオブジェクト(main という名称のオブジェクト)の特異メソッドとして define_method を定義して、トップレベルメソッドが定義できるようにしています。 トップレベルメソッドとはつまりトップレベルオブジェクトの private な特異メソッドとして定義されます。 [ruby-core:45715] [Feature #6609]

shugo:r37418 2012-11-02 14:48:29 +0900

Symbol#to_proc でメソッド呼び出しの Proc オブジェクトに変換する機能でも refinement の影響を考慮して呼ぶメソッドを切り替えるようにしています。実装が難しくてよく読めていませんが、テストをみると確かに refine で拡張したメソッドが using したモジュール内で to_proc した Proc を call すると呼べています。変更箇所をざっとみた限りだと to_proc を呼ぶ場所の影響を受けるので、できた Proc オブジェクトは外に持ち出して呼んでもいいようです。 [ruby-dev:46345] [Bug #7261]

class C
end

module M
  refine(C) do
    def foo
      :foo
    end
  end
  module_function
  def foo_proc
    :foo.to_proc
  end
end

M.foo_proc.call(C.new) # => :foo

svn:r37419 2012-11-02 14:48:34 +0900

version.h の日付更新。

glass:r37420 2012-11-02 16:04:39 +0900

配列の比較(== やeql?)で要素同士の比較を eql? を呼ぶ前にVALUE としての比較をして同値だったら eql の呼び出しをしないようにして高速化しています。 eql? を呼ぶと ruby の実行に移るので配列が操作されてサイズやポインタが変化する可能性があるので、再度取得しなおしているので若干長くなります。 [ruby-dev:45412] [Feature #6177]
時折高速化や不具合修正のパッチを投稿していた Glass_saga さんの初コミットです。

glass:r37421 2012-11-02 16:16:54 +0900

r37420 の ChangeLog エントリの体裁の修正です。

mrkn:r37422 2012-11-02 16:52:56 +0900

rb_bug() などでバックトレースを出力するところで Mac OS X だと ~/Library/Logs/CrashReporterなどにファイルとして出力されるので、そのファイルパスを表示してそこを観るように促していますが、そのファイルパスに ~/Library/Logs/DiagnosticReports を追加しています。 実際のファイルはここに出力されて ~/Library/Logs/CrashReporter にはシンボリックリンクが置かれますね。

sorah:r37423 2012-11-02 17:00:02 +0900

r37422 で修正したバックトレースが出力されるディレクトリのリストを見やすくなるようにインデントなどをそろえて表示するようにしています。

shugo:r37424 2012-11-02 17:53:06 +0900

refinement で使われている拡張のための無名モジュールの to_s, inspect で文字列化した時の表示に # のように C=拡張するクラス/モジュール、 M=拡張に使うモジュールを含む名前を使うようにしています。この 無名モジュールは r37118 で追加された Module#refinements から取得できます。またこの機能のために refine した Module を無名モジュールの __defined_at__ という隠しインスタンス変数に格納するようにしています。

sorah:r37425 2012-11-02 17:56:10 +0900

Test::Unit の並列テスト時に --no-retry オプションをつけて retry を抑制するとメッセージの表示がおかしくなったり failure/error/success のカウントが狂うのを修正しています。 [ruby-core:47250] [Bug #6897]

nobu:r37426 2012-11-02 20:02:27 +0900

r37414 の mkmf.rb のタイムスタンプファイル名の作りかたの再修正。 "!" は nmake と BSD make の特殊文字だったのでかわりに ".-." という文字列を使うようにしています。 [ruby-dev:46358] [Bug #7265]

nobu:r37427 2012-11-02 20:11:21 +0900

さらに mkmf.rb でのタイムスタンプファイル名の決めかたで "@" が前後についていると autoconf の変数が展開されてないように見えるので "@" は削るようにしています。 まさに r36820 でわたしも同じ勘違いをしていますね。

glass:r37428 2012-11-03 00:28:31 +0900

r37420 の ChangeLog エントリに高速化の内容を追記しています。

svn:r37429 2012-11-03 00:28:36 +0900

version.h の日付更新。