diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-06-28 17:15:30 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-06-28 17:15:30 +0900 |
| commit | 684f8ec575e254a92b15a696dac6fc96ade2be2d (patch) | |
| tree | a88857736f5fe78869f63bba072af52d72c90a12 | |
| parent | 344b7d819f70f4ab86b263d28d497e14db3b3ace (diff) | |
| parent | 73c086b4c7e23b85acfbdeb157171db218930e2d (diff) | |
| download | mruby-684f8ec575e254a92b15a696dac6fc96ade2be2d.tar.gz mruby-684f8ec575e254a92b15a696dac6fc96ade2be2d.zip | |
Merge pull request #2430 from SHyx0rmZ/remove-duplicate
Sacrifice some micro-optimization to remove duplicate code
| -rw-r--r-- | src/vm.c | 35 |
1 files changed, 10 insertions, 25 deletions
@@ -309,36 +309,21 @@ ecall(mrb_state *mrb, int i) mrb_value mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, mrb_int argc, ...) { + mrb_value argv[MRB_FUNCALL_ARGC_MAX]; + va_list ap; + mrb_int i; mrb_sym mid = mrb_intern_cstr(mrb, name); - if (argc == 0) { - return mrb_funcall_argv(mrb, self, mid, 0, 0); + if (argc > MRB_FUNCALL_ARGC_MAX) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "Too long arguments. (limit=" TO_STR(MRB_FUNCALL_ARGC_MAX) ")"); } - else if (argc == 1) { - mrb_value v; - va_list ap; - - va_start(ap, argc); - v = va_arg(ap, mrb_value); - va_end(ap); - return mrb_funcall_argv(mrb, self, mid, 1, &v); - } - else { - 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=" TO_STR(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); + 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); } mrb_value |
