ruby-trunk-changes r49857 - r49875

今日は class << obj; end の記法でのスコープの仕様変更や、Module#prepend と内部的に super を呼ぶメソッドの併用での不具合修正、Vector#round の追加などがありました。

kazu: r49857 2015-03-05 23:34:37 +0900

r49800 と r49844 の ChangeLog エントリの typo 修正。

kazu: r49858 2015-03-05 23:36:05 +0900

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

usa: r49859 2015-03-06 02:28:07 +0900

Windows 版で Dir.glob で内部的に利用するバッファの作成に String オブジェクトを使うところで、ObjectSpace が用意される前にここが利用されることがあるらしく、一時オブジェクトが作れなかった時のことを考慮するように修正しています。 [ruby-core:68430] [Bug #10941]

svn: r49860 2015-03-06 02:28:19 +0900

version.h の日付更新。

usa: r49861 2015-03-06 02:51:02 +0900

r49859 の続き。 GLOB_REALLOC() の戻り値をエラーチェックするようにしています。 [ruby-core:68430] [Bug #10941]

ko1: r49862 2015-03-06 07:20:14 +0900

r43973 で導入された struct method_table_wrapper という構造体で method table を共有化して重複した GC の mark を防ぐようにしていましたが、これを削除しています。そもそも Module の mtbl とその Module を include した時に作られる IClass では IClass のほうが寿命が短い(か少くとも同じ)はずなので、IClass 経由の mtbl の mark はスキップするように gc_mark_children() を修正して余分な構造体をはさむコストのほうを削っています。なるほど。

ko1: r49863 2015-03-06 07:22:18 +0900

r49862 の ChangeLog エントリに説明を追記しています。

ko1: r49864 2015-03-06 07:34:10 +0900

gc.c の obj_info() というデバッグ用関数で T_NODE 型のオブジェクトの表示を強化しています。

usa: r49865 2015-03-06 08:03:35 +0900

r49859 の Windows 環境での Dir.glob の修正についてのテストを追記しています。 なるほどーコマンドラインに "*" つきの引数が渡された時の処理で使っていたのか。そういえば Windows ではワイルドカードの展開も ruby でやっているということでした。 [ruby-core:68430] [Bug #10941]

marcandre: r49866 2015-03-06 08:45:42 +0900

標準添付ライブラリ matrix に Vector#round というメソッドを追加しています。単に各要素について round を呼ぶ実装ですね。 https://github.com/ruby/ruby/pull/802

nobu: r49867 2015-03-06 10:31:03 +0900

Module#prepend で Module を挿入した継承ツリーをもつクラスで rb_call_super() を呼ぶと無限再帰してしまっていた不具合を修正しています。 RCLASS_ORIGIN(cfp->klass) の superclass を辿るように修正。 [ruby-core:68434] [ruby-core:68093] [Bug #10847]

nobu: r49868 2015-03-06 10:33:39 +0900

benchmark/driver.rb で --rawdata_output オプションで指定されたファイルに出力する時に拡張子に応じて YAMLJSON での出力も行うようにしています。

nobu: r49869 2015-03-06 10:33:43 +0900

benchmark/driver.rb に --load-rawdata オプションも追加しています。実際にベンチマーク実行するんじゃなくて dump しておいたデータを使って整形するというものみたいですね。主に整形のデバッグのためかも…

ko1: r49870 2015-03-06 17:34:40 +0900

test/ruby/test_beginendblock.rb で子プロセスで Dir.chdir でカレントディレクトリを移動して Kernel#system を呼んでたのをファイルパスのほうを絶対パスに展開するようにしています。 Windows 7 で vboxsf をマウントしているディレクトリ上で system を実行すると "warning: Insecure world writable dir..." という警告が出るのを回避するためとのこと。

ko1: r49871 2015-03-06 18:22:21 +0900

これも vboxsf を(VirtualBox を)使っている時の対応で test/webrick/test_filehandler.rb で File.executable?(__FILE__) をチェックして、テストスクリプトリポジトリ上はないはずの実行権限がついていたら permission がちゃんとサポートされていない環境だと判断してテストを skip するようにしています。

nobu: r49872 2015-03-06 21:12:11 +0900

misc/ruby-mode.el の正規表現の修正。

kazu: r49873 2015-03-06 21:13:29 +0900

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

ko1: r49874 2015-03-06 21:24:58 +0900

class << obj; end という記法で特異クラスのメソッドなどを定義する時にこれも namespace を導入するようにしています。 class << obj; end は普通の class C; end や module M; end とは違って定数探索上の scope になっていなくてここで定数を定義してもその外側のスコープに作られてしまっていたのを変更しています。実装はあまり深く追ってませんが、rb_method_entry_t の iseq 情報に cref 情報も持たせるようになったのと、メソッド呼び出し時の control frame の積み方を少し変更しているようです。method_entry に cref がのってるのってなんか変な気持ちですが、定義時の状態が必要になるということなのでまあそりゃそうか。 [ruby-core:68437] [Bug #10943]

ko1: r49875 2015-03-06 22:51:27 +0900

rb_prepend_module() で RCLASS_ORIGIN(klass) を更新する時に インクリメンタルGC のための WriteBarrier の挿入をしています。 おお、これは 2.1/2.2 にもバックポートが必要ですよね?