diff options
author | 卜部昌平 <shyouhei@ruby-lang.org> | 2019-10-24 18:08:52 +0900 |
---|---|---|
committer | 卜部昌平 <shyouhei@ruby-lang.org> | 2019-10-25 12:24:22 +0900 |
commit | 356e203a3acd4d3d20ba12f956fd22e17b6363e9 (patch) | |
tree | 78b4eccc00668da18debcb3e818146add31da10a /vm_eval.c | |
parent | a7ec88ad61eba8cda3f99805e6077cb515c0ad08 (diff) |
more on struct rb_call_data
Replacing adjacent struct rb_call_info and struct rb_call_cache
into a struct rb_call_data.
Diffstat (limited to 'vm_eval.c')
-rw-r--r-- | vm_eval.c | 64 |
1 files changed, 31 insertions, 33 deletions
@@ -38,34 +38,28 @@ typedef enum call_type { } call_type; static VALUE send_internal(int argc, const VALUE *argv, VALUE recv, call_type scope); -static VALUE vm_call0_body(rb_execution_context_t* ec, struct rb_calling_info *calling, const struct rb_call_info *ci, struct rb_call_cache *cc, const VALUE *argv); +static VALUE vm_call0_body(rb_execution_context_t* ec, struct rb_calling_info *calling, struct rb_call_data *cd, const VALUE *argv); #ifndef MJIT_HEADER MJIT_FUNC_EXPORTED VALUE rb_vm_call0(rb_execution_context_t *ec, VALUE recv, ID id, int argc, const VALUE *argv, const rb_callable_method_entry_t *me, int kw_splat) { - struct rb_calling_info calling_entry, *calling; - struct rb_call_info ci_entry; - struct rb_call_cache cc_entry; - - calling = &calling_entry; - - ci_entry.flag = kw_splat ? VM_CALL_KW_SPLAT : 0; - ci_entry.mid = id; - - cc_entry.me = me; - - calling->recv = recv; - calling->argc = argc; - calling->kw_splat = kw_splat; - - return vm_call0_body(ec, calling, &ci_entry, &cc_entry, argv); + return vm_call0_body( + ec, + &(struct rb_calling_info) { + Qundef, recv, argc, kw_splat, }, + &(struct rb_call_data) { + { 0, 0, me, me->def, vm_call_general, { 0, }, }, + { id, (kw_splat ? VM_CALL_KW_SPLAT : 0), argc, }, }, + argv); } static VALUE -vm_call0_cfunc_with_frame(rb_execution_context_t* ec, struct rb_calling_info *calling, const struct rb_call_info *ci, struct rb_call_cache *cc, const VALUE *argv) +vm_call0_cfunc_with_frame(rb_execution_context_t* ec, struct rb_calling_info *calling, struct rb_call_data *cd, const VALUE *argv) { + const struct rb_call_info *ci = &cd->ci; + const struct rb_call_cache *cc = &cd->cc; VALUE val; const rb_callable_method_entry_t *me = cc->me; const rb_method_cfunc_t *cfunc = UNALIGNED_MEMBER_PTR(me->def, body.cfunc); @@ -109,15 +103,18 @@ vm_call0_cfunc_with_frame(rb_execution_context_t* ec, struct rb_calling_info *ca } static VALUE -vm_call0_cfunc(rb_execution_context_t *ec, struct rb_calling_info *calling, const struct rb_call_info *ci, struct rb_call_cache *cc, const VALUE *argv) +vm_call0_cfunc(rb_execution_context_t *ec, struct rb_calling_info *calling, struct rb_call_data *cd, const VALUE *argv) { - return vm_call0_cfunc_with_frame(ec, calling, ci, cc, argv); + return vm_call0_cfunc_with_frame(ec, calling, cd, argv); } /* `ci' should point temporal value (on stack value) */ static VALUE -vm_call0_body(rb_execution_context_t *ec, struct rb_calling_info *calling, const struct rb_call_info *ci, struct rb_call_cache *cc, const VALUE *argv) +vm_call0_body(rb_execution_context_t *ec, struct rb_calling_info *calling, struct rb_call_data *cd, const VALUE *argv) { + const struct rb_call_info *ci = &cd->ci; + struct rb_call_cache *cc = &cd->cc; + VALUE ret; calling->block_handler = vm_passed_block_handler(ec); @@ -137,13 +134,13 @@ vm_call0_body(rb_execution_context_t *ec, struct rb_calling_info *calling, const *reg_cfp->sp++ = argv[i]; } - vm_call_iseq_setup(ec, reg_cfp, calling, ci, cc); + vm_call_iseq_setup(ec, reg_cfp, calling, cd); VM_ENV_FLAGS_SET(ec->cfp->ep, VM_FRAME_FLAG_FINISH); return vm_exec(ec, TRUE); /* CHECK_INTS in this function */ } case VM_METHOD_TYPE_NOTIMPLEMENTED: case VM_METHOD_TYPE_CFUNC: - ret = vm_call0_cfunc(ec, calling, ci, cc, argv); + ret = vm_call0_cfunc(ec, calling, cd, argv); goto success; case VM_METHOD_TYPE_ATTRSET: if (calling->kw_splat && @@ -173,7 +170,7 @@ vm_call0_body(rb_execution_context_t *ec, struct rb_calling_info *calling, const ret = rb_attr_get(calling->recv, cc->me->def->body.attr.id); goto success; case VM_METHOD_TYPE_BMETHOD: - ret = vm_call_bmethod_body(ec, calling, ci, cc, argv); + ret = vm_call_bmethod_body(ec, calling, cd, argv); goto success; case VM_METHOD_TYPE_ZSUPER: case VM_METHOD_TYPE_REFINED: @@ -1001,20 +998,22 @@ rb_funcallv_public_kw(VALUE recv, ID mid, int argc, const VALUE *argv, int kw_sp /*! * Calls a method * \private - * \param cc opaque call cache + * \param cd opaque call data * \param recv receiver of the method * \param mid an ID that represents the name of the method * \param argc the number of arguments * \param argv pointer to an array of method arguments */ VALUE -rb_funcallv_with_cc(struct rb_call_cache_and_mid *cc, VALUE recv, ID mid, int argc, const VALUE *argv) +rb_funcallv_with_cc(struct rb_call_data *cd, VALUE recv, ID mid, int argc, const VALUE *argv) { - if (LIKELY(cc->mid == mid)) { - const struct rb_call_info ci = { mid, VM_CALL_ARGS_SIMPLE, argc, }; - vm_search_method(&ci, &cc->cc, recv); + const struct rb_call_info *ci = &cd->ci; + struct rb_call_cache *cc = &cd->cc; + + if (LIKELY(ci->mid == mid)) { + vm_search_method(cd, recv); - if (LIKELY(! UNDEFINED_METHOD_ENTRY_P(cc->cc.me))) { + if (LIKELY(! UNDEFINED_METHOD_ENTRY_P(cc->me))) { return vm_call0_body( GET_EC(), &(struct rb_calling_info) { @@ -1023,14 +1022,13 @@ rb_funcallv_with_cc(struct rb_call_cache_and_mid *cc, VALUE recv, ID mid, int ar argc, RB_NO_KEYWORDS, }, - &ci, - &cc->cc, + cd, argv ); } } - *cc = (struct rb_call_cache_and_mid) /* reset */ { { 0, }, mid, }; + *cd = (struct rb_call_data) /* reset */ { { 0, }, { mid, }, }; return rb_funcallv(recv, mid, argc, argv); } |