diff options
author | Koichi Sasada <[email protected]> | 2023-07-31 16:04:16 +0900 |
---|---|---|
committer | Koichi Sasada <[email protected]> | 2023-07-31 17:13:43 +0900 |
commit | 280419d0e0ba3e96e19551c70cba789fbedd80e1 (patch) | |
tree | b77175e523f51fb120bcd30a7c2624407bf7381e /vm_eval.c | |
parent | e40f8bbd20eb65d14992f1f7dce12b4c5edf614e (diff) |
`calling->cd` instead of `calling->ci`
`struct rb_calling_info::cd` is introduced and `rb_calling_info::ci`
is replaced with it to manipulate the inline cache of iseq while
method invocation process. So that `ci` can be acessed with
`calling->cd->ci`. It adds one indirection but it can be justified
by the following points:
1) `vm_search_method_fastpath()` doesn't need `ci` and also
`vm_call_iseq_setup_normal()` doesn't need `ci`. It means
reducing `cd->ci` access in `vm_sendish()` can make it faster.
2) most of method types need to access `ci` once in theory
so that 1 additional indirection doesn't matter.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/8129
Diffstat (limited to 'vm_eval.c')
-rw-r--r-- | vm_eval.c | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -96,7 +96,10 @@ vm_call0_cc(rb_execution_context_t *ec, VALUE recv, ID id, int argc, const VALUE } struct rb_calling_info calling = { - .ci = &VM_CI_ON_STACK(id, flags, argc, NULL), + .cd = &(struct rb_call_data) { + .ci = &VM_CI_ON_STACK(id, flags, argc, NULL), + .cc = NULL, + }, .cc = cc, .block_handler = vm_passed_block_handler(ec), .recv = recv, @@ -117,7 +120,7 @@ vm_call0_cme(rb_execution_context_t *ec, struct rb_calling_info *calling, const static VALUE vm_call0_super(rb_execution_context_t *ec, struct rb_calling_info *calling, const VALUE *argv, VALUE klass, enum method_missing_reason ex) { - ID mid = vm_ci_mid(calling->ci); + ID mid = vm_ci_mid(calling->cd->ci); klass = RCLASS_SUPER(klass); if (klass) { @@ -136,7 +139,7 @@ vm_call0_super(rb_execution_context_t *ec, struct rb_calling_info *calling, cons static VALUE vm_call0_cfunc_with_frame(rb_execution_context_t* ec, struct rb_calling_info *calling, const VALUE *argv) { - const struct rb_callinfo *ci = calling->ci; + const struct rb_callinfo *ci = calling->cd->ci; VALUE val; const rb_callable_method_entry_t *me = vm_cc_cme(calling->cc); const rb_method_cfunc_t *cfunc = UNALIGNED_MEMBER_PTR(me->def, body.cfunc); @@ -201,7 +204,7 @@ vm_call_check_arity(struct rb_calling_info *calling, int argc, const VALUE *argv static VALUE vm_call0_body(rb_execution_context_t *ec, struct rb_calling_info *calling, const VALUE *argv) { - const struct rb_callinfo *ci = calling->ci; + const struct rb_callinfo *ci = calling->cd->ci; const struct rb_callcache *cc = calling->cc; VALUE ret; |