summaryrefslogtreecommitdiff
path: root/vm_method.c
diff options
context:
space:
mode:
author卜部昌平 <shyouhei@ruby-lang.org>2019-10-29 11:37:25 +0900
committer卜部昌平 <shyouhei@ruby-lang.org>2019-11-05 11:39:35 +0900
commit6ff1250739c57ce7f234a2148d3f6214da01b7e5 (patch)
tree169447ceb51f397b202994104a514a8b1764ecd3 /vm_method.c
parent1390d56ecfac2e430df94c4d4a60d8fa80d11166 (diff)
rb_method_basic_definition_p with CC
Noticed that rb_method_basic_definition_p is frequently called. Its callers include vm_caller_setup_args_block(), rb_hash_default_value(), rb_num_neative_int_p(), and a lot more. It seems worth caching the method resolution part. Majority of rb_method_basic_definion_p() usages take fixed class and fixed method id combinations. Calculating ------------------------------------- ours trunk so_matrix 2.379 2.115 i/s - 1.000 times in 0.420409s 0.472879s Comparison: so_matrix ours: 2.4 i/s trunk: 2.1 i/s - 1.12x slower
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/2629
Diffstat (limited to 'vm_method.c')
-rw-r--r--vm_method.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/vm_method.c b/vm_method.c
index 5ee1773fe2..311a66993a 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -2024,6 +2024,21 @@ rb_mod_modfunc(int argc, VALUE *argv, VALUE module)
return module;
}
+bool
+rb_method_basic_definition_p_with_cc(struct rb_call_data *cd, VALUE klass, ID mid)
+{
+ if (cd->ci.mid != mid) {
+ *cd = (struct rb_call_data) /* reset */ { .ci = { .mid = mid, }, };
+ }
+
+ vm_search_method_fastpath(cd, klass);
+ return cd->cc.me && METHOD_ENTRY_BASIC(cd->cc.me);
+}
+
+#ifdef __GNUC__
+#pragma push_macro("rb_method_basic_definition_p")
+#undef rb_method_basic_definition_p
+#endif
int
rb_method_basic_definition_p(VALUE klass, ID id)
{
@@ -2032,6 +2047,9 @@ rb_method_basic_definition_p(VALUE klass, ID id)
me = rb_method_entry(klass, id);
return (me && METHOD_ENTRY_BASIC(me)) ? TRUE : FALSE;
}
+#ifdef __GNUC__
+#pragma pop_macro("rb_method_basic_definition_p")
+#endif
static VALUE
call_method_entry(rb_execution_context_t *ec, VALUE defined_class, VALUE obj, ID id,