なかだです。

At Wed, 24 Dec 2003 16:48:01 +0900,
Yukihiro Matsumoto wrote:
> |そういえば、次の `to_s': method `to_s' overridden (TypeError) というの
> |はなぜ起こるんでしょうか?
> 
> なぜか明示的にチェックしてますね。なんでチェックを入れたのか
> 全然思い出せないんですけど。3年前の自分は別人だ。

どうせチェックするなら、define_methodの時点でしたほうがいいんじゃ
ないでしょうか。


Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.614 diff -u -2 -p -d -r1.614 eval.c --- eval.c 23 Dec 2003 19:53:42 -0000 1.614 +++ eval.c 24 Dec 2003 08:07:08 -0000 @@ -7799,5 +7799,15 @@ rb_mod_define_method(argc, argv, mod) } if (RDATA(body)->dmark == (RUBY_DATA_FUNC)bm_mark) { - node = NEW_DMETHOD(method_unbind(body)); + VALUE rklass = ((struct METHOD *)DATA_PTR(body))->rklass; + if (rklass != mod) { + if (FL_TEST(rklass, FL_SINGLETON)) { + rb_raise(rb_eTypeError, "singleton method cannot bound to a different class"); + } + if (RCLASS(rklass)->super && !rb_mod_le(mod, rklass)) { + rb_raise(rb_eTypeError, "bind argument must be a subclass of %s", + rb_class2name(rklass)); + } + } + node = ((struct METHOD *)DATA_PTR(body))->body; } else if (RDATA(body)->dmark == (RUBY_DATA_FUNC)blk_mark) { Index: object.c =================================================================== RCS file: /cvs/ruby/src/ruby/object.c,v retrieving revision 1.134 diff -u -2 -p -d -r1.134 object.c --- object.c 22 Dec 2003 12:15:34 -0000 1.134 +++ object.c 24 Dec 2003 08:01:32 -0000 @@ -641,5 +641,5 @@ rb_mod_eqq(mod, arg) } -static VALUE +VALUE rb_mod_le(mod, arg) VALUE mod, arg;
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦