diff --git a/mjit_compile.c b/mjit_compile.c index 39609cdf90..1407c4635a 100644 --- a/mjit_compile.c +++ b/mjit_compile.c @@ -69,8 +69,8 @@ inlinable_iseq_p(CALL_INFO ci, CALL_CACHE cc, const rb_iseq_t *iseq) { extern bool rb_simple_iseq_p(const rb_iseq_t *iseq); return iseq != NULL - && rb_simple_iseq_p(iseq) && !(ci->flag & VM_CALL_KW_SPLAT) /* Top of vm_callee_setup_arg. In this case, opt_pc is 0. */ - && (!IS_ARGS_SPLAT(ci) && !IS_ARGS_KEYWORD(ci) && !(METHOD_ENTRY_VISI(cc->me) == METHOD_VISI_PROTECTED)); /* CC_SET_FASTPATH */ + && !(ci->flag & VM_CALL_KW_SPLAT) && rb_simple_iseq_p(iseq) // Top of vm_callee_setup_arg. In this case, opt_pc is 0. + && vm_call_iseq_optimizable_p(ci, cc); // CC_SET_FASTPATH condition } static int diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 6407f13ca0..aed0f28103 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -1782,9 +1782,7 @@ vm_callee_setup_arg(rb_execution_context_t *ec, struct rb_calling_info *calling, argument_arity_error(ec, iseq, calling->argc, iseq->body->param.lead_num, iseq->body->param.lead_num); } - CC_SET_FASTPATH(cc, vm_call_iseq_setup_func(ci, param_size, local_size), - (!IS_ARGS_SPLAT(ci) && !IS_ARGS_KEYWORD(ci) && - !(METHOD_ENTRY_VISI(cc->me) == METHOD_VISI_PROTECTED))); + CC_SET_FASTPATH(cc, vm_call_iseq_setup_func(ci, param_size, local_size), vm_call_iseq_optimizable_p(ci, cc)); return 0; } else if (rb_iseq_only_optparam_p(iseq)) { diff --git a/vm_insnhelper.h b/vm_insnhelper.h index c004e5ecd6..98aee9d46c 100644 --- a/vm_insnhelper.h +++ b/vm_insnhelper.h @@ -239,4 +239,13 @@ THROW_DATA_CONSUMED_SET(struct vm_throw_data *obj) #define IS_ARGS_SPLAT(ci) ((ci)->flag & VM_CALL_ARGS_SPLAT) #define IS_ARGS_KEYWORD(ci) ((ci)->flag & VM_CALL_KWARG) +/* If this returns true, an optimized function returned by `vm_call_iseq_setup_func` + can be used as a fastpath. */ +static bool +vm_call_iseq_optimizable_p(const struct rb_call_info *ci, const struct rb_call_cache *cc) +{ + return !IS_ARGS_SPLAT(ci) && !IS_ARGS_KEYWORD(ci) && + !(METHOD_ENTRY_VISI(cc->me) == METHOD_VISI_PROTECTED); +} + #endif /* RUBY_INSNHELPER_H */