[#24112] ruby/tk crashes on bcc32 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。原因を追求してたのですが、力尽きました。

19 messages 2004/08/18
[#24127] Re: ruby/tk crashes on bcc32 — Hidetoshi NAGAI <nagai@...> 2004/08/19

永井@知能.九工大です.

[#24131] Re: ruby/tk crashes on bcc32 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/08/19

山本です。

[#24135] Re: ruby/tk crashes on bcc32 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/08/19

山本です。試行錯誤の結果、これで落ちなくなりました。

[ruby-dev:24174] 'undefined superclass' message are required?

From: SASADA Koichi <ko1@...>
Date: 2004-08-25 04:31:53 UTC
List: ruby-dev #24174
 ささだです.

 superclass関連でエラーがでたとき,undefined superclass
というメッセージが表示されますが,これは必要でしょうか.

1.メッセージが不完全

B, B::C が未定義のとき,

class A < B::C
end

では, undefined superclass `C' (TypeError) になります.

そもそも B がないので,このエラーメッセージは不適当だと思います.
(B がない,もしくは B::C がない,というべきだと思います)


2.エラーの型として正しいか不明

 上の例では,通常の場合だと B なんてネーゾ,ということで,
NameError になりますが,この場合だと TypeError になってます.

 もっと変な例を挙げると,

class SomeException < Exception; end
class A < (raise SomeException)::C
end

 でも undefined superclass `C' (TypeError) になります.


 もっと変な例を挙げると,

class SomeException < Exception; end
class A < (raise SomeException)
end

 は SomeException (SomeException) です.


 もっと変な例を挙げると,

class A < (exit)::C; end では undefined superclass `C' (TypeError)
になって,class A < exit では,何もしないで終了します.



 これらのアンバランスさは,eval.c#superclass() の実装をこの
メッセージのためにアドホックに追加しているためだと考えます.

 そもそも,superclass の場所で起こったエラーが大抵 TypeError
で,superclass が未定義である,というメッセージを出力する必要
はありますでしょうか.NameError でも,ほとんどデバッグの手間な
どは変わらないと思います.たとえば,上記の例 class A < B::C
では, uninitialized constant B (NameError) と出してくれれば,
ミスに気づくと思います.


 というわけで,

Index: eval.c
===================================================================
RCS file: /src/ruby/eval.c,v
retrieving revision 1.688
diff -u -r1.688 eval.c
--- eval.c      19 Aug 2004 07:33:15 -0000      1.688
+++ eval.c      25 Aug 2004 04:25:06 -0000
@@ -3769,7 +3769,8 @@
                rb_raise(rb_eTypeError, "no outer class/module");
            }
            if (node->nd_super) {
-               super = superclass(self, node->nd_super);
+               super = rb_eval(self, node->nd_super);
+               rb_check_inheritable(super);
            }
            else {
                super = 0;

 みたいにして,superclass() なんて消しちゃう,ってのはどうでしょうか.


-- 
// SASADA Koichi at atdot dot net
//

// また重箱の隅ですが・・・

In This Thread

Prev Next