summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-method/src/method.c
diff options
context:
space:
mode:
Diffstat (limited to 'mrbgems/mruby-method/src/method.c')
-rw-r--r--mrbgems/mruby-method/src/method.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/mrbgems/mruby-method/src/method.c b/mrbgems/mruby-method/src/method.c
index 73933049f..b8a55e618 100644
--- a/mrbgems/mruby-method/src/method.c
+++ b/mrbgems/mruby-method/src/method.c
@@ -20,15 +20,19 @@ args_shift(mrb_state *mrb)
mrb_value *argv = ci->stack + 1;
if (ci->n < 15) {
+ if (ci->n == 0) { goto argerr; }
+ mrb_assert(ci->nk == 0 || ci->nk == 15);
mrb_value obj = argv[0];
- memmove(argv, argv + 1, (ci->n + 1 /* block */ - 1 /* first value */) * sizeof(mrb_value));
+ int count = ci->n + (ci->nk == 0 ? 0 : 1) + 1 /* block */ - 1 /* first value */;
+ memmove(argv, argv + 1, count * sizeof(mrb_value));
ci->n--;
return obj;
}
- else if (ci->n == 15 && RARRAY_LEN(*argv) > 0) {
+ else if (RARRAY_LEN(*argv) > 0) {
return mrb_ary_shift(mrb, *argv);
}
else {
+ argerr:
mrb_argnum_error(mrb, 0, 1, -1);
return mrb_undef_value(); /* not reached */
}
@@ -41,9 +45,12 @@ args_unshift(mrb_state *mrb, mrb_value obj)
mrb_value *argv = ci->stack + 1;
if (ci->n < 15) {
- mrb_value block = argv[ci->n];
+ mrb_assert(ci->nk == 0 || ci->nk == 15);
argv[0] = mrb_ary_new_from_values(mrb, ci->n, argv);
- argv[1] = block;
+ argv[1] = argv[ci->n]; // keyword or block
+ if (ci->nk == 15) {
+ argv[2] = argv[ci->n + 1]; // block
+ }
ci->n = 15;
}