Bug #3136
closedreuse of singleton method definition causes SEGV
Description
=begin
遠藤です。
以下で 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 のコンテキスト情報を持たせている設計が
バグだと思いました。
解決方法としては、
-
rb_iseq_t 以外で super のコンテキスト情報を管理する
(Ruby レベルのメソッドでも rb_method_entry_t の klass を
使うようにする?) -
メソッドを定義するたびに rb_iseq_t を複製する
を思いつきましたが、どちらも結構タフそうな変更です。
安定させるのに時間がかかることが予想されるため、がんばって
早く直してください > ささださん。
また、[ruby-dev:40458] の修正も急ぎ目でお願いします。
--
Yusuke Endoh mame@tsg.ne.jp
=end