diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-05-27 23:22:28 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-10-12 16:20:57 +0900 |
| commit | dcd3e5907ca830f118bf7b55bbf1b1210a67385d (patch) | |
| tree | 713f95d62afc62d30a80860d6c1252dc19a8ceca /src | |
| parent | 80c15ddd1544f7cfe342701368cade2b5cec0193 (diff) | |
| download | mruby-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.c | 19 |
1 files changed, 19 insertions, 0 deletions
@@ -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) { |
