Skip to content

Commit

Permalink
* vm_method.c (basic_obj_respond_to): should not call
Browse files Browse the repository at this point in the history
  #respond_to_missing? for not implemented methods.
  [ruby-core:25909]

* vm_method.c (rb_method_boundp): returns exceptional value 2 for
  not-implemented methods when called from #respond_to? (specifies
  by new contant NOEX_RESPONDS).

* method.h (enum): new constant NOEX_RESPONDS added.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25234 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
matz committed Oct 4, 2009
1 parent 0e260ef commit e3fc29a
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 10 deletions.
12 changes: 12 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
Mon Oct 5 00:09:57 2009 Yukihiro Matsumoto <[email protected]>

* vm_method.c (basic_obj_respond_to): should not call
#respond_to_missing? for not implemented methods.
[ruby-core:25909]

* vm_method.c (rb_method_boundp): returns exceptional value 2 for
not-implemented methods when called from #respond_to? (specifies
by new contant NOEX_RESPONDS).

* method.h (enum): new constant NOEX_RESPONDS added.

Sun Oct 4 22:16:29 2009 Takeyuki FUJIOKA <[email protected]>

* lib/cgi/cookie.rb: add default value to @@accept_charset
Expand Down
3 changes: 2 additions & 1 deletion method.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ typedef enum {
NOEX_UNDEF = NOEX_NOSUPER,
NOEX_MODFUNC = 0x12,
NOEX_SUPER = 0x20,
NOEX_VCALL = 0x40
NOEX_VCALL = 0x40,
NOEX_RESPONDS = 0x80
} rb_method_flag_t;

#define NOEX_SAFE(n) ((int)((n) >> 8) & 0x0F)
Expand Down
21 changes: 12 additions & 9 deletions vm_method.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit e3fc29a

Please sign in to comment.