チケット #2402 が更新されました。 (by Yusuke Endoh)

担当者 Yukihiro MatsumotoからKoichi Sasadaに変更

遠藤です。

> instance_evalのブロック内でsuperを呼ぶと、instance_evalで変更された
> selfに対してsuperの呼び出しを行ってしまうようです。

再現しました。以下で SEGV することも確認しました。

  class MyArray < Array
    def reverse
      "foo".instance_eval do
        super
      end
    end
  end
  MyArray.new([1,2,3]).reverse

パッチも見ました。速度劣化は気になりますが、正しいと思います。


vm_search_superclass を追ってみたところ、recv が必要になるのは、
現在のコンテキストが include された module に所属するメソッドの
場合 (ICLASS) だけのようですので、その時まで recv の同定を遅延
させると、速度劣化も気にならなくなるかもと思います。

ただ、その辺の修正は [ruby-dev:40959] の修正の後にやったほうが
いい予感がするので、最適化は後にして、とりあえずこの問題は前田
さんのパッチで close するのがいいと思います。

-- 
Yusuke Endoh <mame / tsg.ne.jp>
----------------------------------------
http://redmine.ruby-lang.org/issues/show/2402

----------------------------------------
http://redmine.ruby-lang.org