summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2025-12-04 17:35:38 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2025-12-04 18:07:49 +0900
commit7f41c3e7b1373f35cc073241b3773289be9be03e (patch)
treebd044f371545be878974306863354caaed87ac54
parentf8231dacd570e8c96c385fb9691719756b1dbc7d (diff)
Add `rb_eval_cmd_call_kw` to shortcut
-rw-r--r--internal/vm.h1
-rw-r--r--signal.c2
-rw-r--r--variable.c2
-rw-r--r--vm_eval.c14
4 files changed, 15 insertions, 4 deletions
diff --git a/internal/vm.h b/internal/vm.h
index e5ed47afae..7fae590d19 100644
--- a/internal/vm.h
+++ b/internal/vm.h
@@ -78,6 +78,7 @@ void rb_check_stack_overflow(void);
VALUE rb_block_call2(VALUE obj, ID mid, int argc, const VALUE *argv, rb_block_call_func_t bl_proc, VALUE data2, long flags);
struct vm_ifunc *rb_current_ifunc(void);
VALUE rb_gccct_clear_table(VALUE);
+VALUE rb_eval_cmd_call_kw(VALUE cmd, int argc, const VALUE *argv, int kw_splat);
#if USE_YJIT || USE_ZJIT
/* vm_exec.c */
diff --git a/signal.c b/signal.c
index 5971e12ee9..12af9058a2 100644
--- a/signal.c
+++ b/signal.c
@@ -1066,7 +1066,7 @@ signal_exec(VALUE cmd, int sig)
EC_PUSH_TAG(ec);
if ((state = EC_EXEC_TAG()) == TAG_NONE) {
VALUE signum = INT2NUM(sig);
- rb_eval_cmd_kw(cmd, rb_ary_new3(1, signum), RB_NO_KEYWORDS);
+ rb_eval_cmd_call_kw(cmd, 1, &signum, RB_NO_KEYWORDS);
}
EC_POP_TAG();
ec = GET_EC();
diff --git a/variable.c b/variable.c
index faeffec660..47b5218566 100644
--- a/variable.c
+++ b/variable.c
@@ -862,7 +862,7 @@ rb_define_virtual_variable(
static void
rb_trace_eval(VALUE cmd, VALUE val)
{
- rb_eval_cmd_kw(cmd, rb_ary_new3(1, val), RB_NO_KEYWORDS);
+ rb_eval_cmd_call_kw(cmd, 1, &val, RB_NO_KEYWORDS);
}
VALUE
diff --git a/vm_eval.c b/vm_eval.c
index 281d63a1b8..12bdabc330 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -2148,6 +2148,17 @@ rb_eval_string_wrap(const char *str, int *pstate)
VALUE
rb_eval_cmd_kw(VALUE cmd, VALUE arg, int kw_splat)
{
+ Check_Type(arg, T_ARRAY);
+ int argc = RARRAY_LENINT(arg);
+ const VALUE *argv = RARRAY_CONST_PTR(arg);
+ VALUE val = rb_eval_cmd_call_kw(cmd, argc, argv, kw_splat);
+ RB_GC_GUARD(arg);
+ return val;
+}
+
+VALUE
+rb_eval_cmd_call_kw(VALUE cmd, int argc, const VALUE *argv, int kw_splat)
+{
enum ruby_tag_type state;
volatile VALUE val = Qnil; /* OK */
rb_execution_context_t * volatile ec = GET_EC();
@@ -2155,8 +2166,7 @@ rb_eval_cmd_kw(VALUE cmd, VALUE arg, int kw_splat)
EC_PUSH_TAG(ec);
if ((state = EC_EXEC_TAG()) == TAG_NONE) {
if (!RB_TYPE_P(cmd, T_STRING)) {
- val = rb_funcallv_kw(cmd, idCall, RARRAY_LENINT(arg),
- RARRAY_CONST_PTR(arg), kw_splat);
+ val = rb_funcallv_kw(cmd, idCall, argc, argv, kw_splat);
}
else {
val = eval_string_with_cref(rb_vm_top_self(), cmd, NULL, 0, 0);