diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-10-11 12:42:50 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-10-11 12:42:50 +0000 |
commit | cc2334bd7bdeae8e91397576020d397a3d04af5f (patch) | |
tree | 93fcdac5b5aa7c4d11a6e011a89275cd2103ffac /eval.c | |
parent | a3cb2093ef475648c1845b70122639e9f69e85e7 (diff) |
* eval.c (rb_obj_respond_to): check if obj responds to the given
method with the given visibility. [ruby-dev:27408]
* eval.c (rb_respond_to): conform to Object#respond_to?. [ruby-dev:27411]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9376 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 26 |
1 files changed, 17 insertions, 9 deletions
@@ -4011,19 +4011,27 @@ module_setup(VALUE module, NODE *n) 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); +} /* * call-seq: @@ -4035,7 +4043,7 @@ 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; ID id; @@ -7553,7 +7561,7 @@ Init_eval(void) rb_define_global_function("method_missing", rb_method_missing, -1); 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); rb_global_variable((VALUE*)&basic_respond_to); |