summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-05-27 23:22:28 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2020-10-12 16:20:57 +0900
commitdcd3e5907ca830f118bf7b55bbf1b1210a67385d (patch)
tree713f95d62afc62d30a80860d6c1252dc19a8ceca /src
parent80c15ddd1544f7cfe342701368cade2b5cec0193 (diff)
downloadmruby-dcd3e5907ca830f118bf7b55bbf1b1210a67385d.tar.gz
mruby-dcd3e5907ca830f118bf7b55bbf1b1210a67385d.zip
Define a new function `mrb_funcall_id()`.
`mrb_funcall_id()` takes `mrb_sym` instead of `char*` for a method name. You can use `MRB_SYM()`/`MRB_QSYM()` to specify the method to call.
Diffstat (limited to 'src')
-rw-r--r--src/vm.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/vm.c b/src/vm.c
index 2e96cd0dc..5543496c1 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -401,6 +401,25 @@ mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, mrb_int argc, ...)
return mrb_funcall_argv(mrb, self, mid, argc, argv);
}
+MRB_API mrb_value
+mrb_funcall_id(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc, ...)
+{
+ mrb_value argv[MRB_FUNCALL_ARGC_MAX];
+ va_list ap;
+ mrb_int i;
+
+ if (argc > MRB_FUNCALL_ARGC_MAX) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "Too long arguments. (limit=" MRB_STRINGIZE(MRB_FUNCALL_ARGC_MAX) ")");
+ }
+
+ va_start(ap, argc);
+ for (i = 0; i < argc; i++) {
+ argv[i] = va_arg(ap, mrb_value);
+ }
+ va_end(ap);
+ return mrb_funcall_argv(mrb, self, mid, argc, argv);
+}
+
static int
ci_nregs(mrb_callinfo *ci)
{