From: Shugo Maeda Date: 2012-08-04T01:38:48+09:00 Subject: [ruby-dev:46028] Re: [ruby-cvs:43788] shugo:r36612 (trunk): * insns.def (invokesuper): don't skip the same class. instead, use 前田です。 2012年8月4日 0:22 Shugo Maeda : >> このコミットで壊れました。 > > superの実装を1.8に合わせたんですが、1.9だとnd_orig相当のものが > なさそう(というかiseq->klassを使ってたので必要なかった)なので、 > aliasの時に上手く動かないのですね。 > ちょっと考えてみます…。 1.8と同じように実装しようかと考えたんですが、1.8でもICLASSが絡むと superの動作がおかしい気がします。 $ cat alias_test.rb module M def foo p M super end alias bar foo end class Base def foo p Base end end class Derived < Base include M end Derived.new.foo Derived.new.bar $ ruby -v alias_test.rb ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-linux] M Base M alias_test.rb:4:in `bar': super: no superclass method `foo' for # (NoMethodError) from alias_test.rb:21 Derived.new.barもDerived.new.fooと同じ動作になるべきではないかと思います。 実際、JRubyではちゃんと動きました。 $ jruby -v alias_test.rb jruby 1.6.7 (ruby-1.8.7-p357) (2012-02-22 3e82bc8) (OpenJDK Server VM 1.6.0_24) [linux-i386-java] M Base M Base しかし、JRubyではBug #3351の例でスタックオーバーフローが起きるようです。 とりあえずr36612はrevertしてBug #3351をreopenしました。 それでも、スタックオーバーフローはr36595で回避しているので前の動作よりは マシかなと思いますが。 -- Shugo Maeda