diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-08-20 05:13:28 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-08-20 05:13:28 +0000 |
commit | 629d26ef3a41cf585f92ac6d0d8b0a17a47c3daa (patch) | |
tree | b2fe87f9c90528d9506a8dda119954ffa13803bd /vm_method.c | |
parent | 24da2db3e1eab67b6ee7be00d75b73beb273a4c4 (diff) | |
download | ruby-629d26ef3a41cf585f92ac6d0d8b0a17a47c3daa.tar.gz |
vm_eval.c: share with rb_obj_respond_to
* vm_eval.c (check_funcall_respond_to): share the behavior with
rb_obj_respond_to. [ruby-core:70460] [Bug #11465]
* vm_method.c (vm_respond_to): extract from rb_obj_respond_to and
merge r39881.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51646 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_method.c')
-rw-r--r-- | vm_method.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/vm_method.c b/vm_method.c index fd000fa95a..e74de0d49c 100644 --- a/vm_method.c +++ b/vm_method.c @@ -1829,10 +1829,9 @@ basic_obj_respond_to(VALUE obj, ID id, int pub) } } -int -rb_obj_respond_to(VALUE obj, ID id, int priv) +static int +vm_respond_to(rb_thread_t *th, VALUE klass, VALUE obj, ID id, int priv) { - VALUE klass = CLASS_OF(obj); VALUE defined_class; const ID resid = idRespond_to; const rb_method_entry_t *const me = @@ -1845,12 +1844,20 @@ rb_obj_respond_to(VALUE obj, ID id, int priv) else { int argc = 1; VALUE args[2]; + VALUE result; const rb_callable_method_entry_t *cme; + const rb_block_t *passed_block = th->passed_block; args[0] = ID2SYM(id); args[1] = Qtrue; if (priv) { - if (rb_method_entry_arity(me) != 1) { + argc = rb_method_entry_arity(me); + if (argc > 2) { + rb_raise(rb_eArgError, + "respond_to? must accept 1 or 2 arguments (requires %d)", + argc); + } + if (argc != 1) { argc = 2; } else if (!NIL_P(ruby_verbose)) { @@ -1871,11 +1878,19 @@ rb_obj_respond_to(VALUE obj, ID id, int priv) } } cme = prepare_callable_method_entry(defined_class, resid, me); - return RTEST(vm_call0(GET_THREAD(), obj, resid, argc, args, cme)); + result = vm_call0(th, obj, resid, argc, args, cme); + th->passed_block = passed_block; + return RTEST(result); } } int +rb_obj_respond_to(VALUE obj, ID id, int priv) +{ + return vm_respond_to(GET_THREAD(), CLASS_OF(obj), obj, id, priv); +} + +int rb_respond_to(VALUE obj, ID id) { return rb_obj_respond_to(obj, id, FALSE); |