diff --git a/include/mrbconf.h b/include/mrbconf.h index 5d307e66f..757192d89 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -23,6 +23,10 @@ #undef HAVE_UNISTD_H /* WINDOWS */ #define HAVE_UNISTD_H /* LINUX */ + +#define MRB_FUNCALL_ARGC_MAX 16U /* Allocate arrays using auto variable. */ +//#undef MRB_FUNCALL_ARGC_MAX /* Allocate arrays using mrb_malloc if undefned. */ + /* end of configuration */ #ifdef MRB_USE_FLOAT 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