diff options
Diffstat (limited to 'vm_method.c')
-rw-r--r-- | vm_method.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/vm_method.c b/vm_method.c index ec381c40d7..a31fb8b5ac 100644 --- a/vm_method.c +++ b/vm_method.c @@ -515,12 +515,14 @@ rb_method_boundp(VALUE klass, ID id, int ex) if (ex && (me->flag & NOEX_PRIVATE)) { return FALSE; } - if (!me->def || me->def->type == VM_METHOD_TYPE_NOTIMPLEMENTED) { - return FALSE; + if (!me->def) return 0; + if (me->def->type == VM_METHOD_TYPE_NOTIMPLEMENTED) { + if (ex & NOEX_RESPONDS) return 2; + return 0; } - return TRUE; + return 1; } - return FALSE; + return 0; } void @@ -1151,13 +1153,14 @@ basic_obj_respond_to(VALUE obj, ID id, int pub) { VALUE klass = CLASS_OF(obj); - if (!rb_method_boundp(klass, id, pub)) { - if (!rb_method_basic_definition_p(klass, respond_to_missing)) { - return RTEST(rb_funcall(obj, respond_to_missing, pub ? 1 : 2, ID2SYM(id), Qtrue)); - } + switch (rb_method_boundp(klass, id, pub|NOEX_RESPONDS)) { + case 2: return FALSE; + case 0: + return RTEST(rb_funcall(obj, respond_to_missing, pub ? 1 : 2, ID2SYM(id), Qtrue)); + default: + return TRUE; } - return TRUE; } int |