diff options
author | 卜部昌平 <shyouhei@ruby-lang.org> | 2019-09-04 15:55:02 +0900 |
---|---|---|
committer | 卜部昌平 <shyouhei@ruby-lang.org> | 2019-09-05 12:13:07 +0900 |
commit | dd2b9d4a96e6c9784daf645efc79bef11eb1decb (patch) | |
tree | b2b0ac62e5a2186c3f6396f57b53bac0ec487893 /vm_eval.c | |
parent | b005d7c2e208790b89b332d5f8ca56334039d6ae (diff) |
hide rb_funcallv_with_cc from public
Requested by ko1. Also, because now that this function is internal
use only, why not just directly use struct rb_call_cache to purge
the ZALLOC.
Diffstat (limited to 'vm_eval.c')
-rw-r--r-- | vm_eval.c | 33 |
1 files changed, 9 insertions, 24 deletions
@@ -876,34 +876,19 @@ rb_funcallv_public(VALUE recv, ID mid, int argc, const VALUE *argv) * \param argv pointer to an array of method arguments */ VALUE -rb_funcallv_with_cc(void **ptr, VALUE recv, ID mid, int argc, const VALUE *argv) +rb_funcallv_with_cc(struct rb_call_cache_and_mid *cc, VALUE recv, ID mid, int argc, const VALUE *argv) { - VM_ASSERT(ptr); - struct opaque { - struct rb_call_cache cc; - ID mid; - } *cc; - if (UNLIKELY(! *ptr)) { - *ptr = ZALLOC(struct opaque); - } - cc = *ptr; - - const struct rb_call_info ci = { mid, VM_CALL_ARGS_SIMPLE, argc, }; - if (UNLIKELY(cc->mid != mid)) { - *cc = (struct opaque) /* reset */ { { 0, }, mid, }; - return rb_funcallv(recv, mid, argc, argv); - } - else { + if (LIKELY(cc->mid == mid)) { + const struct rb_call_info ci = { mid, VM_CALL_ARGS_SIMPLE, argc, }; vm_search_method(&ci, &cc->cc, recv); - } - if (UNLIKELY(UNDEFINED_METHOD_ENTRY_P(cc->cc.me))) { - /* :FIXME: this path can be made faster */ - return rb_funcallv(recv, mid, argc, argv); - } - else { - return rb_vm_call0(GET_EC(), recv, mid, argc, argv, cc->cc.me); + if (LIKELY(! UNDEFINED_METHOD_ENTRY_P(cc->cc.me))) { + return rb_vm_call0(GET_EC(), recv, mid, argc, argv, cc->cc.me); + } } + + *cc = (struct rb_call_cache_and_mid) /* reset */ { { 0, }, mid, }; + return rb_funcallv(recv, mid, argc, argv); } VALUE |