summaryrefslogtreecommitdiff
path: root/vm_macro.def
diff options
context:
space:
mode:
Diffstat (limited to 'vm_macro.def')
-rw-r--r--vm_macro.def120
1 files changed, 11 insertions, 109 deletions
diff --git a/vm_macro.def b/vm_macro.def
index adeaa52ac6..99351efdc5 100644
--- a/vm_macro.def
+++ b/vm_macro.def
@@ -2,7 +2,6 @@
/* do not use C++ style comment */
/* */
-
MACRO macro_eval_setup_send_arguments(num, blockptr, flag, blockiseq)
{
if (flag & VM_CALL_ARGS_BLOCKARG_BIT) {
@@ -83,115 +82,15 @@ MACRO macro_eval_invoke_cfunc(num, id, recv, klass, mn, blockptr)
MACRO macro_eval_invoke_func(niseqval, recv, klass, blockptr, num)
{
rb_iseq_t *niseq;
- VALUE *sp = GET_SP();
- VALUE *rsp = sp - num - 1;
- int opt_pc = 0, clear_local_size, i;
+ int opt_pc, i;
+ VALUE *rsp = GET_SP() - num;
+ VALUE *sp;
/* TODO: eliminate it */
GetISeqPtr(niseqval, niseq);
- clear_local_size = niseq->local_size - num;
-
- /* simple (only mandatory) arguments */
- if (niseq->arg_simple) {
- if (niseq->argc != num) {
- rb_raise(rb_eArgError, "%d - wrong number of arguments (%lu for %d)",
- 0, (unsigned long)num, niseq->argc);
- }
- }
- else {
- /* optional arguments */
- if (niseq->arg_opts) {
- int iseq_argc = niseq->argc;
- int opts = niseq->arg_opts - 1;
-
- if (num < iseq_argc ||
- (niseq->arg_rest == -1 && num > iseq_argc + opts)) {
- if (0) {
- printf("num: %lu, iseq_argc: %d, opts: %d\n",
- (unsigned long)num, iseq_argc, opts);
- }
- rb_raise(rb_eArgError,
- "%d - wrong number of arguments (%lu for %d)",
- 1, (unsigned long)num, iseq_argc);
- }
-
- if (0) printf("num: %lu, opts: %d, iseq_argc: %d\n",
- (unsigned long)num, opts, iseq_argc);
-
- if (num - iseq_argc < opts) {
- opt_pc = niseq->arg_opt_tbl[num - iseq_argc];
- sp += opts - (num - iseq_argc);
- num += opts - (num - iseq_argc);
- clear_local_size = niseq->local_size - (iseq_argc + opts);
- }
- else {
- opt_pc = niseq->arg_opt_tbl[opts];
- }
- }
-
- /* rest argument */
- if (niseq->arg_rest != -1) {
- int rest = niseq->arg_rest - 1 /* spec val */;
- int pack_size = num - rest;
-
- if (0) {
- printf("num: %lu, rest: %d, ps: %d\n",
- (unsigned long)num, rest, pack_size);
- }
-
- if (pack_size < 0) {
- rb_raise(rb_eArgError,
- "%d - wrong number of arguments (%lu for %d)",
- 2, (unsigned long)num, rest - niseq->arg_opts);
- }
-
- /*
- * def m(x, y, z, *a) (rest: 3) =>
- * x, y, z, a, b, c <SP> (num: 6, pack_size = 3)
- * => x, y, z, [a,b,c] <SP> (num: 4)
- */
- rsp[rest + 1] = rb_ary_new4(pack_size, &rsp[rest + 1]);
- sp = &rsp[rest + 1 + 1];
- num = rest + 1;
- clear_local_size = niseq->local_size - (rest + 1);
- }
-
- /* block argument */
- if (niseq->arg_block != -1) {
- VALUE arg_block_val = Qnil;
-
- if (!((num == niseq->arg_rest) ||
- (niseq->arg_opts && num == niseq->argc + niseq->arg_opts - 1)
- || num == niseq->argc)) {
-
- if (0) printf("num: %d, rest: %d, opts: %d, argc: %d\n",
- num, niseq->arg_rest, niseq->arg_opts, niseq->argc);
-
- rb_raise(rb_eArgError,
- "%d - wrong number of arguments (%lu for %d)",
- 3, (unsigned long)num, niseq->argc);
- }
-
- if (blockptr) {
- /* make Proc object */
- if (blockptr->proc == 0) {
- rb_proc_t *proc;
- reg_cfp->sp = sp;
- arg_block_val = th_make_proc(th, GET_CFP(), blockptr);
- GetProcPtr(arg_block_val, proc);
- blockptr = &proc->block;
- }
- else {
- arg_block_val = blockptr->proc;
- }
- }
-
- rsp[1 + niseq->arg_block - 1] = arg_block_val;
- sp++;
- clear_local_size--;
- }
- }
+ opt_pc = callee_setup_arg(th, niseq, num, rsp, &blockptr);
+ sp = rsp + niseq->arg_size;
/* stack overflow check */
if (CHECK_STACK_OVERFLOW(th, GET_CFP(), niseq->stack_max + 0x100)) {
@@ -210,7 +109,7 @@ MACRO macro_eval_invoke_func(niseqval, recv, klass, blockptr, num)
sp -= rsp - p_rsp;
- for (i = 0; i < clear_local_size; i++) {
+ for (i = 0; i < niseq->local_size - niseq->arg_size; i++) {
*sp++ = Qnil;
}
@@ -219,7 +118,10 @@ MACRO macro_eval_invoke_func(niseqval, recv, klass, blockptr, num)
niseq->iseq_encoded + opt_pc, sp, 0, 0);
}
else {
- for (i = 0; i < clear_local_size; i++) {
+ if (0) printf("local_size: %d, arg_size: %d\n",
+ niseq->local_size, niseq->arg_size);
+
+ for (i = 0; i < niseq->local_size - niseq->arg_size; i++) {
*sp++ = Qnil;
}
@@ -227,7 +129,7 @@ MACRO macro_eval_invoke_func(niseqval, recv, klass, blockptr, num)
FRAME_MAGIC_METHOD, recv, (VALUE) blockptr,
niseq->iseq_encoded + opt_pc, sp, 0, 0);
- reg_cfp->sp = rsp;
+ reg_cfp->sp = rsp - 1 /* recv */;
}
RESTORE_REGS();