Skip optimized method check for most method IDs

Previously every time a method was defined on a module, we would
recursively walk all subclasses to see if the module was included in a
class which the VM optimizes for (such as Integer#+).

For most method definitions we can tell immediately that this won't be
the case based on the method's name. To do this we just keep a hash with
method IDs of optimized methods and if our new method isn't in that list
we don't need to check subclasses at all.
This commit is contained in:
John Hawthorn 2019-12-12 15:47:59 -08:00 committed by Aaron Patterson
parent 9245462499
commit 254477248c
Notes: git 2019-12-18 02:19:26 +09:00
3 changed files with 24 additions and 2 deletions

View file

@ -500,7 +500,7 @@ rb_add_refined_method_entry(VALUE refined_class, ID mid)
}
static void
check_override_opt_method(VALUE klass, VALUE arg)
check_override_opt_method_i(VALUE klass, VALUE arg)
{
ID mid = (ID)arg;
const rb_method_entry_t *me, *newme;
@ -512,7 +512,15 @@ check_override_opt_method(VALUE klass, VALUE arg)
if (newme != me) rb_vm_check_redefinition_opt_method(me, me->owner);
}
}
rb_class_foreach_subclass(klass, check_override_opt_method, (VALUE)mid);
rb_class_foreach_subclass(klass, check_override_opt_method_i, (VALUE)mid);
}
static void
check_override_opt_method(VALUE klass, VALUE mid)
{
if (rb_vm_check_optimizable_mid(mid)) {
check_override_opt_method_i(klass, mid);
}
}
/*