From: nobuyoshi nakada Date: 2005-10-11T16:20:36+09:00 Subject: [ruby-dev:27415] Re: Ripper.new("").parse blocks なかだです。 At Mon, 10 Oct 2005 21:41:33 +0900, nobu@ruby-lang.org wrote in [ruby-dev:27414]: > > |a) rb_respond_to()はObject#respond_to?にあわせる > > | デフォルトではpublicのみ、privateまで探すには別関数を使う > > > > |b) 可視性を指定できる(Object#respond_to?相当の)関数を追加する > > | rb_respond_to()でrb_funcall()するときはQtrueを追加する > > > > いずれにしても rb_respond_to()はObject#respond_to?のデフォル > > トの挙動にあわせてpublicのみに変更すべきでしょうね。 > > とりあえずそっちは直しておきますか。 もう一点、basic_respond_toから変更されていなくても定義されてい ないときにはrespond_to?を呼び出しているのは、basic_respond_toで チェックする意味がないというか、むしろ逆に遅くなってないでしょ うか。 名前はとりあえず、[ruby-dev:27408]のrb_obj_respond_to()で。意味 は違いますが。 Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.836 diff -U2 -p -r1.836 eval.c --- eval.c 8 Oct 2005 10:50:08 -0000 1.836 +++ eval.c 11 Oct 2005 06:33:47 -0000 @@ -4012,17 +4012,25 @@ static NODE *basic_respond_to = 0; int -rb_respond_to(VALUE obj, ID id) +rb_obj_respond_to(VALUE obj, ID id, int priv) { VALUE klass = CLASS_OF(obj); - if (rb_method_node(klass, respond_to) == basic_respond_to && - rb_method_boundp(klass, id, 0)) { - return Qtrue; + + if (rb_method_node(klass, respond_to) == basic_respond_to) { + return rb_method_boundp(klass, id, !priv); } - else{ - return rb_funcall(obj, respond_to, 1, ID2SYM(id)); + else { + VALUE args[2]; + int n = 0; + args[n++] = ID2SYM(id); + if (priv) args[n++] = Qtrue; + return rb_funcall2(obj, respond_to, n, args); } - return Qfalse; } +int +rb_respond_to(VALUE obj, ID id) +{ + return rb_obj_respond_to(obj, id, Qfalse); +} /* @@ -4036,5 +4044,5 @@ rb_respond_to(VALUE obj, ID id) static VALUE -rb_obj_respond_to(int argc, VALUE *argv, VALUE obj) +obj_respond_to(int argc, VALUE *argv, VALUE obj) { VALUE mid, priv; @@ -7554,5 +7562,5 @@ Init_eval(void) rb_define_global_function("loop", rb_f_loop, 0); - rb_define_method(rb_mKernel, "respond_to?", rb_obj_respond_to, -1); + rb_define_method(rb_mKernel, "respond_to?", obj_respond_to, -1); respond_to = rb_intern("respond_to?"); basic_respond_to = rb_method_node(rb_cObject, respond_to); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦