Add "*!" argument specifier to avoid stack copying.

parent 059d707e
...@@ -896,15 +896,25 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) ...@@ -896,15 +896,25 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
{ {
mrb_value **var; mrb_value **var;
mrb_int *pl; mrb_int *pl;
mrb_bool nocopy = FALSE;
if (*format == '!') {
format++;
nocopy = TRUE;
}
var = va_arg(ap, mrb_value**); var = va_arg(ap, mrb_value**);
pl = va_arg(ap, mrb_int*); pl = va_arg(ap, mrb_int*);
if (argc > i) { if (argc > i) {
*pl = argc-i; *pl = argc-i;
if (*pl > 0) { if (*pl > 0) {
mrb_value args = mrb_ary_new_from_values(mrb, *pl, ARGV+arg_i); if (nocopy) {
RARRAY(args)->c = NULL; *var = ARGV+arg_i;
*var = (mrb_value*)RARRAY_PTR(args); }
else {
mrb_value args = mrb_ary_new_from_values(mrb, *pl, ARGV+arg_i);
RARRAY(args)->c = NULL;
*var = (mrb_value*)RARRAY_PTR(args);
}
} }
i = argc; i = argc;
arg_i += *pl; arg_i += *pl;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment