rb_method_entry() returns valid me.

search_method() can return invalid method, but vm_defined() checks
it as valid method entry. This is why defined?(foo) if foo is undef'ed.
To solve this problem, check invalidation and return NULL.
[Bug #16669]
https://twitter.com/kamipo/status/1252881930103558144

Tests will be merged by nobu soon.
This commit is contained in:
Koichi Sasada 2020-04-23 02:16:12 +09:00
parent 492e8599c6
commit 8119bcbfc0

View File

@ -936,7 +936,13 @@ search_method_protect(VALUE klass, ID id, VALUE *defined_class_ptr)
MJIT_FUNC_EXPORTED const rb_method_entry_t *
rb_method_entry(VALUE klass, ID id)
{
return search_method(klass, id, NULL);
const rb_method_entry_t *me = search_method(klass, id, NULL);
if (me && me->def && me->def->type != VM_METHOD_TYPE_UNDEF) {
return me;
}
else {
return NULL;
}
}
static inline const rb_callable_method_entry_t *