FUJIMOTO Hisa
fhisa****@users*****
Wed Oct 5 11:43:26 JST 2005
藤本です。 05/10/04 に kimura wataru<kimur****@i*****> さんは書きました: > 以下の問題を修正してコミットしたので報告します。 どうもありがとうございます! > sf.netのバグトラッキングにいつのまにかタレコミされていたものです。 > http://sourceforge.net/tracker/?func=detail&atid=438476&aid=1283390&group_id=44114 > > (現象) > ruby上でCocoaのサブクラスのサブクラスを定義し、そのインスタンスメソッド > を呼ぶとクラッシュします。 > > 例) > ---- > class A < OSX::NSObject > end > > class B < A > end > > b = B.alloc.init # => CRASH! > ---- これはずっと前から気づいていて、かつ解決方法がわからなかったので、「孫 クラスは作れない」みたいなことを FAQ あたりに書いたような気もします(未 確認)。 > (原因) > OverrideMixin.mのsuper_imp()で取得したスーパークラス(例ではA)の > メソッドrespondsToSelector:のIMPが、Bのメソッドど同一のアドレスに > なるために、無限ループします。 > > (対応) > super_impの実装を変更し、RubyCocoaでオーバーライドしたメソッドは > 無視して、クラス階層をたどるようにしました。 > -[B respondsToSelector:]をsuper_imp()で取得すると、今までは > -[A respondsToSelector:]が返ってきていたのが、-[NSObject > respondsToSelector:]を返すようになります。 すごい。ここらへんまでハックしてるんですね。 そろそろ書き直したい症候群を発症しそうになったりしませんか (笑 -- hisa