ruby-trunk-changes r36589 - r36600

今日は include によって ancestors に同じ Module が複数回現れた時の super の挙動修正と、待望の Refinement 機能がコミットされています。

nobu:r36589 2012-08-02 07:29:26 +0900

string.c, vm_insnhelper.c, vm_method.c で TYPE() マクロを利用していた部分を RB_TYPE_P() と BUILTIN_TYPE() を利用するように変更しています。

svn:r36590 2012-08-02 07:29:31 +0900

version.h の日付更新。

nobu:r36591 2012-08-02 07:29:58 +0900

mkmf.rb のテストで Mac OS X 版の -framework オプションのテストでエラー時に mkmf.log を表示するようにしています。

emboss:r36592 2012-08-02 10:58:49 +0900

OpenSSL::Digest() というクラス名と同名のメソッドを追加して、名前で OpenSSL::Digest::XXX の子クラスを返すようにしています。 const_get しているだけですが OpenSSL::Digest("SHA1").new のように書けるようになりました。[ruby-core:46908] [Feature #6819]

nari:r36593 2012-08-02 11:47:12 +0900

GC::Profiler.enable? が true/false を返すべきところ int 型を VALUE として返してしまっていたのを修正。 [ruby-core:46919] [Bug #6821]

naruse:r36594 2012-08-02 13:24:13 +0900

Mac OS Xコンパイラを clang, gcc, cc の順に選択するようにしています。最新の Xcode だと gccllvm-gcc になっていてこれの最適化が不具合を引き起こすので非推奨になっています。これで configure --with-gcc=clang としなくてもよくなりそうですね。 [ruby-core:46888] [Bug #6816]

shugo:r36595 2012-08-02 20:08:44 +0900

テストがないのでどういう問題を修正したのかよくわかりませんが、ささだ先生に教わったところ include の順番によって Module が ancestors の中に複数回現れることがあって(C1 -> M -> C2 -> M -> Object のような感じ)、その場合に super を使うと 2つ目の M の(正確には M の IClass の)メソッド内での super が 1つ目の M の位置しか取れなくて再度 M -> C2 -> M と辿って無限ループしてしまうという問題に対処するため、VM のスタックフレームにメソッドの定義クラスを積んで super で正確に ancestors に現れる順にメソッドを遡れるようにしています。たぶんこれチケットになってたと思うのですが見付けられず。
[追記] znz さんに教えてもらいました。 [ruby-core:30450] [Bug #3351] [/追記]

shugo:r36596 2012-08-02 20:34:19 +0900

Refinement の機能がコミットされました!
Refinement は Module/Class のメソッドの再定義を影響範囲を限定して行なうことができるようにする機能です。 Module#refine というメソッドのブロックで再定義して

class C
  def m1
    :M
  end
end
module M_ex
  refine C do
    def m1
      :M_ex
    end
  end
end

そのモジュールを Module#using で取り込むとその Module 内だけで再定義が有効になります。

class A
  C.new.m1 # => :M
end

class B
  using M_ex
  C.new.m1 # => :M_ex
end

今日はとりあえずさわりの紹介だけ。詳しい仕様や実装の確認もそのうちしたいですね。

nobu:r36597 2012-08-02 20:36:53 +0900

新規追加されたファイルの svn property 設定。

nobu:r36598 2012-08-02 21:52:50 +0900

行末の空白除去。

ktsj:r36599 2012-08-02 22:57:19 +0900

インデントの修正。

ktsj:r36600 2012-08-02 23:38:48 +0900

Module#refine の rdoc について、戻り値が self と表記されていましたが生成した Module を返すと修正しています。