From: Yusuke Endoh Date: 2010-04-12T22:45:39+09:00 Subject: [ruby-dev:40959] [Bug #3136] reuse of singleton method definition causes SEGV Bug #3136: reuse of singleton method definition causes SEGV http://redmine.ruby-lang.org/issues/show/3136 起票者: Yusuke Endoh ステータス: Open, 優先度: Normal Target version: 1.9.2 ruby -v: ruby 1.9.2dev (2010-04-12 trunk 27317) [i686-linux] 遠藤です。 以下で SEGV します。 def overlaid(obj) class << obj def reverse super end end end overlaid(str = "123") # (1) overlaid(ary = [1,2,3]) # (2) str.reverse # (3) => SEGV 一連の流れを説明すると: - (1) によって、reverse の iseq が "123" のメソッドとなる。 (reverse の iseq の klass に「String を継承した特異クラス」 がセットされる) - (2) によって、reverse の iseq が [1,2,3] のメソッドとなる (reverse の iseq の klass に「Array を継承した特異クラス」 が *上書き* される) - (3) によって、String のインスタンスを self として reverse の iseq が実行される。その中の super で現在実行中の iseq の klass (= Array を継承した特異クラス) を元に呼び出す メソッドを決める。すると Array#reverse が選ばれてしまう。 - String のインスタンスを self として rb_ary_reverse が実行 されてしまう。 iseq の klass に super のコンテキスト情報を持たせている設計が バグだと思いました。 解決方法としては、 1. rb_iseq_t 以外で super のコンテキスト情報を管理する (Ruby レベルのメソッドでも rb_method_entry_t の klass を 使うようにする?) 2. メソッドを定義するたびに rb_iseq_t を複製する を思いつきましたが、どちらも結構タフそうな変更です。 安定させるのに時間がかかることが予想されるため、がんばって 早く直してください > ささださん。 また、[ruby-dev:40458] の修正も急ぎ目でお願いします。 -- Yusuke Endoh ---------------------------------------- http://redmine.ruby-lang.org