diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-07-18 06:08:51 -0700 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-07-18 06:08:51 -0700 |
| commit | a7e0f9f6408f3c1a081ca221615f2e675deb2976 (patch) | |
| tree | d907a2584ffca628597d6d166fc0ea35aac8fb5e /src/class.c | |
| parent | fdc224ff2fd43edfcb8cbe3d60a57bbe6daf1459 (diff) | |
| parent | f146fd039706c426c738fc1186a86fa1fca89a4a (diff) | |
| download | mruby-a7e0f9f6408f3c1a081ca221615f2e675deb2976.tar.gz mruby-a7e0f9f6408f3c1a081ca221615f2e675deb2976.zip | |
Merge pull request #324 from monaka/pr-remove-magic-numbers-in-mrb_funcall
Remove magic numbers in mrb_funcall()
Diffstat (limited to 'src/class.c')
| -rw-r--r-- | src/class.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/src/class.c b/src/class.c index 7f53b7a2b..762fa1591 100644 --- a/src/class.c +++ b/src/class.c @@ -863,26 +863,42 @@ mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid) } mrb_value -mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, int argc,...) +mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, int argc, ...) { - mrb_value args[16]; +#if defined(MRB_FUNCALL_ARGC_MAX) + mrb_value args[MRB_FUNCALL_ARGC_MAX]; +#else + mrb_value *args = NULL; +#endif + mrb_value result; va_list ap; int i; - if (argc == 0) { - for (i=0; i<5; i++) { - args[i] = mrb_nil_value(); - } - } - else { + if (argc != 0) { +#if !defined(MRB_FUNCALL_ARGC_MAX) + args = mrb_malloc(mrb, sizeof(mrb_value) * argc); +#else + if (argc > MRB_FUNCALL_ARGC_MAX) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "Too long arguments. (limit=%d)\n", MRB_FUNCALL_ARGC_MAX); + } +#endif + va_start(ap, argc); - // assert(argc < 16); - for (i=0; i<argc; i++) { + for (i = 0; i < argc; i++) { args[i] = va_arg(ap, mrb_value); } va_end(ap); } - return mrb_funcall_argv(mrb, self, name, argc, args); + + result = mrb_funcall_argv(mrb, self, name, argc, args); + +#if !defined(MRB_FUNCALL_ARGC_MAX) + if (args != NULL) { + mrb_free(mrb, args); + } +#endif + + return result; } |
