From: nobu.nakada@... Date: 2001-12-08T11:28:11+09:00 Subject: [ruby-dev:15400] Re: UnboundMethod.bind to derived class instance なかだです。 At Sat, 8 Dec 2001 08:12:36 +0900, Nobuyoshi-Nakada wrote: > > たとえばObjectのインスタンスとそのサブクラスのStringのインス > > タンスでは構造が違います。だからおんなじクラスでないとダメな > > んですよ。 > > うーん、でもそれはMarshallのように、instance_of?ではなくて > TYPE()が等しいかどうかで見たほうがいいような気がするのですが。 考えてみたら、それってObjectだけの特殊ケースのような気がして来 ました。スーパークラスとサブクラスで構造が違うというのは、TYPE が違うObjectとT_OBJECT以外のクラス間と、DATA_PTRが違うDataとそ のサブクラス間でしかありえないのでは。 さらにいえば、実装上の構造が問題になりえるのは、Cで実装したメソッ ドだけのような。 Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.233 diff -u -2 -p -r1.233 eval.c --- eval.c 2001/11/29 15:57:25 1.233 +++ eval.c 2001/12/08 01:53:20 @@ -6815,5 +6815,8 @@ umethod_bind(method, recv) rb_raise(rb_eTypeError, "method `%s' overridden", rb_id2name(data->oid)); } - if (!((TYPE(data->oklass) == T_MODULE) ? + if ((nd_type(data->body) == NODE_CFUNC || nd_type(data->body) == NODE_IFUNC) && + !((data->oklass == rb_cObject) ? + (TYPE(recv) == T_OBJECT) : + (data->oklass == rb_cData) ? rb_obj_is_kind_of(recv, data->oklass) : rb_obj_is_instance_of(recv, data->oklass))) { -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦