summaryrefslogtreecommitdiff
path: root/vm_eval.c
diff options
context:
space:
mode:
author卜部昌平 <shyouhei@ruby-lang.org>2019-09-04 15:55:02 +0900
committer卜部昌平 <shyouhei@ruby-lang.org>2019-09-05 12:13:07 +0900
commitdd2b9d4a96e6c9784daf645efc79bef11eb1decb (patch)
treeb2b0ac62e5a2186c3f6396f57b53bac0ec487893 /vm_eval.c
parentb005d7c2e208790b89b332d5f8ca56334039d6ae (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.c33
1 files changed, 9 insertions, 24 deletions
diff --git a/vm_eval.c b/vm_eval.c
index 852aacba45..ccf24b347e 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -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