Project

General

Profile

Actions

Bug #3136

closed

reuse of singleton method definition causes SEGV

Added by mame (Yusuke Endoh) over 14 years ago. Updated over 13 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 1.9.2dev (2010-04-12 trunk 27317) [i686-linux]
Backport:
[ruby-dev:40959]

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 のコンテキスト情報を持たせている設計が
バグだと思いました。

解決方法としては、

  1. rb_iseq_t 以外で super のコンテキスト情報を管理する
    (Ruby レベルのメソッドでも rb_method_entry_t の klass を
    使うようにする?)

  2. メソッドを定義するたびに rb_iseq_t を複製する

を思いつきましたが、どちらも結構タフそうな変更です。

安定させるのに時間がかかることが予想されるため、がんばって
早く直してください > ささださん。

また、[ruby-dev:40458] の修正も急ぎ目でお願いします。

--
Yusuke Endoh
=end


Related issues 5 (0 open5 closed)

Related to Ruby master - Bug #2402: super in instance_evalClosedmatz (Yukihiro Matsumoto)Actions
Related to Ruby master - Bug #3080: class_variable_set issue with duped ModuleClosednobu (Nobuyoshi Nakada)04/02/2010Actions
Related to Ruby master - Bug #4178: test/rubygems/gemutilities.rb で、よくわからない ArgumentErrorClosed12/21/2010Actions
Is duplicate of Ruby master - Bug #2502: strange behavior of anonymous class inside a procClosedko1 (Koichi Sasada)12/19/2009Actions
Is duplicate of Ruby master - Bug #2420: super call may use wrong receiver objectClosedko1 (Koichi Sasada)12/02/2009Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0