mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
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:
parent
9245462499
commit
254477248c
Notes:
git
2019-12-18 02:19:26 +09:00
3 changed files with 24 additions and 2 deletions
12
vm_method.c
12
vm_method.c
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue