ruby-trunk-changes r30071 - r30079

昨日パッチを投稿した件はちょっと考慮が足りてなくて仕様通りだったみたいです。詳しくは以下で。

nobu:r30071 2010-12-03 22:36:49 +0900

昨日報告した protected のメソッドを特異クラスで protected すると同じクラスのインスタンスから呼べなくなる修正で、モジュールを extend すると動かなかったのを修正。 rb_real_class で特異クラスや IClass をスキップしてクラスまで辿ってから is_a? 関係をチェックするようにしています。が、この件は rejected になりました。#4106 詳細は r30074 で。

nobu:r30072 2010-12-04 07:46:53 +0900

mkmf.rb の tr_cpp でポインタ(*) を P で置換するように。

svn:r30073 2010-12-04 07:46:55 +0900

version.h の日付更新。

nobu:r30074 2010-12-04 08:25:19 +0900

r30064 と r30071 を revert しています。 #4106 は、元々定義されているメソッドをオブジェクトの特異クラス内で protected にした時に呼び出せない、という報告だったのですが、これは仕様という判断だったようです。

class A
  def meth
    :meth
  end
  def test(other)
    other.meth
  end
end

a = A.new
class << a
  protected :meth
end
a2 = A.new
a2.test(a)    # <- ここで a2 から a の meth が呼べるか?

こういう状況ですが、特異クラス内で protected にするということは、その特異クラスと is_a? 関係にあるオブジェクトからしか呼べない、つまり a からしか呼べないということで NoMethodError になるのが正解。なるほどー。
たとえば特異クラス内で alias すると特異メソッドが定義されることになるので、protected を実行するのも同様に protected な特異メソッドを追加することになるんですね。という解釈です。

nobu:r30075 2010-12-04 08:50:13 +0900

iconv で $VERBOSE が nil に設定されていたら警告メッセージを抑制するようにしています。

nobu:r30076 2010-12-04 11:08:05 +0900

vm_core.h に欠けていた関数のプロトタイプ宣言を追加。

akr:r30077 2010-12-04 11:18:42 +0900

今日の関数マクロの引数かっこつけ忘れの修正は class.c でした。

nobu:r30078 2010-12-04 11:21:53 +0900

rb_hash_update_by という Hash の操作(update)を実行する C の API が追加されています。関数ポインタを渡してその関数にキー、2つのハッシュのそれぞれの値を渡してどちらを採用するかを判定させるようになっています。C から Hash#update のブロックつき呼び出しみたいなことを Ruby のメソッド呼び出しを介さずに(つまり割り込みなしに)実行したい時に使えるようです。

drbrain:r30079 2010-12-04 11:41:13 +0900

OpenSSL::X509::Extension.new の rdoc を追加。