aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authork0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-03-21 06:25:09 +0000
committerk0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-03-21 06:25:09 +0000
commit52bd8f6f68a45cb990a827e4a1c276251cdf471c (patch)
tree2947a7afacab980caf8b325c9ab8d17422040f97
parenta8695d5022d7afbf004765bfb86457fbb9d56457 (diff)
downloadruby-52bd8f6f68a45cb990a827e4a1c276251cdf471c.tar.gz
Share vm_call_iseq_optimizable_p to reduce copy-paste
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67329 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--mjit_compile.c4
-rw-r--r--vm_insnhelper.c4
-rw-r--r--vm_insnhelper.h9
3 files changed, 12 insertions, 5 deletions
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 */