Issue #2402 has been updated by shugo (Shugo M.).
shugo (Shugo M.) wrote:
instance_evalの中でsuperを呼んだ時に正しいレシーバを見つけるために r36640 で外側のフレームを辿る
ようにしたのですが、 Bug #6907 の問題があったので r36795 でrevertしました。現状はNotImplementedErrorがraiseされますが、こういうケースでsuperが呼べないのを仕様ということに
するなら(selfのtypeがおかしいという意味で)TypeErrorが妥当ですかねえ。
一点補足すると、1.8ではinstance_evalではフレームのselfは変えずにrb_evalの引数だけ変えているみたいなので
instance_evalの中でsuperした時もちゃんと元のselfが使われるようですが、このためだけにselfを二重に持つのは
何だかなあという気がしています。
でもorphanなProcからsuperを呼んだ時とかを考えると他の方法を思い付きません。
Bug #2402: super in instance_eval
Author: shugo (Shugo M.)
Status: Open
Priority: High
Assignee: ko1 (Koichi Sasada)
Category:
Target version: 2.0.0
ruby -v: ruby 1.9.2dev (2009-11-24 trunk 25909) [i686-linux]
=begin
instance_evalのブロック内でsuperを呼ぶと、instance_evalで変更された
selfに対してsuperの呼び出しを行ってしまうようです。
defiant:build$ cat t.rb
class Foo
def foo
p self
end
end
class Bar < Foo
def foo
x = Object.new
x.instance_eval do
super
end
end
end
Bar.new.foo
defiant:build$ ./ruby-trunk.1124 -v t.rb
ruby 1.9.2dev (2009-11-24 trunk 25909) [i686-linux]
#Object:0x8590f6c
Foo#fooが呼ばれるのにselfがObjectという、ちょっとおかしなことになっています。
ちょっと自信がありませんが、一応パッチを添付します。
=end