Backport #567
closedsuperclass of singleton class in 1.8
Description
=begin
遠藤です。
http://d.hatena.ne.jp/sumim/20080913/p1
の最後で指摘されていることですが、1.8 の継承関係がおかしいと
思います。
Kernel は Module のインスタンスなので、Kernel の特異クラスの
superclass は Module になることを期待しますが、今の 1.8 は
Module の特異クラスが superclass になっています。
1.8 がこうなった経緯は [ruby-dev:23690] や [ruby-list:40520] の
ようです。
この話のもともとの問題は [ruby-list:40525] にありますが、特異
クラスは Class のインスタンスであって、Class のサブクラスじゃ
ないのは不思議なことではないです。例えば、何かのオブジェクトが
Object のサブクラスじゃなくても不思議じゃないです。
また、このプログラムで定義されたメソッドは、呼び出しても
bind argument must be an instance of Class (TypeError)
になるだけです。
モジュール Foo を self として Class#allocate を実行しようと
しているので、正常な例外です。
つまりもともとの問題のプログラムは、通るようにする理由がない
と思います。
ただ、この話は define_method の時に型チェックするようになった
1.9 だけで起きる現象だと思うのですが、なぜかパッチは 1.8 だけに
入っています。2005 年当時は状況が違ったのかもしれませんが。
以上より、1.8 から問題のパッチをはずした方がいいと思います。
どうでしょうか。
Index: object.c¶
--- object.c (revision 19361)
+++ object.c (working copy)
@@ -1363,11 +1363,6 @@
rb_raise(rb_eTypeError, "compared with non class/module");
}
- if (FL_TEST(mod, FL_SINGLETON)) {
- if (RCLASS(mod)->m_tbl == RCLASS(arg)->m_tbl)
-
return Qtrue;
- mod = RBASIC(mod)->klass;
- }
while (mod) {
if (RCLASS(mod)->m_tbl == RCLASS(arg)->m_tbl)
return Qtrue;
@@ -1674,9 +1669,6 @@
if (!super) {
rb_raise(rb_eTypeError, "uninitialized class");
} - if (FL_TEST(klass, FL_SINGLETON)) {
- super = RBASIC(klass)->klass;
- }
while (TYPE(super) == T_ICLASS) {
super = RCLASS(super)->super;
}
--
Yusuke ENDOH mame@tsg.ne.jp
=end