diff options
Diffstat (limited to 'src/vm.c')
| -rw-r--r-- | src/vm.c | 40 |
1 files changed, 27 insertions, 13 deletions
@@ -292,6 +292,9 @@ ecall(mrb_state *mrb, int i) ptrdiff_t nstk; if (i<0) return; + if (mrb->c->ci - mrb->c->cibase > MRB_FUNCALL_DEPTH_MAX) { + mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err)); + } p = mrb->c->ensure[i]; if (!p) return; if (mrb->c->ci->eidx > i) @@ -1188,19 +1191,13 @@ RETRY_TRY_BLOCK: mrb_method_missing(mrb, mid, recv, args); } mid = missing; - if (n == CALL_MAXARGS-1) { + if (n != CALL_MAXARGS) { + mrb_value blk = regs[bidx]; regs[a+1] = mrb_ary_new_from_values(mrb, n, regs+a+1); - SET_NIL_VALUE(regs[bidx]); - n++; - } - if (n == CALL_MAXARGS) { - mrb_ary_unshift(mrb, regs[a+1], sym); - } - else { - value_move(regs+a+2, regs+a+1, n+1); - regs[a+1] = sym; - n++; + regs[a+2] = blk; + n = CALL_MAXARGS; } + mrb_ary_unshift(mrb, regs[a+1], sym); } /* push callinfo */ @@ -1387,6 +1384,8 @@ RETRY_TRY_BLOCK: ci->mid = mid; ci->proc = m; ci->stackent = mrb->c->stack; + ci->target_class = c; + ci->pc = pc + 1; { int bidx; mrb_value blk; @@ -1402,10 +1401,9 @@ RETRY_TRY_BLOCK: blk = regs[bidx]; if (!mrb_nil_p(blk) && mrb_type(blk) != MRB_TT_PROC) { regs[bidx] = mrb_convert_type(mrb, blk, MRB_TT_PROC, "Proc", "to_proc"); + ci = mrb->c->ci; } } - ci->target_class = c; - ci->pc = pc + 1; /* prepare stack */ mrb->c->stack += a; @@ -1678,6 +1676,9 @@ RETRY_TRY_BLOCK: ce = mrb->c->cibase + e->cioff; while (--ci > ce) { + if (ci->env) { + mrb_env_unshare(mrb, ci->env); + } if (ci->acc < 0) { localjump_error(mrb, LOCALJUMP_ERROR_RETURN); goto L_RAISE; @@ -1729,6 +1730,9 @@ RETRY_TRY_BLOCK: mrb->c->ci = ci; break; } + if (ci->env) { + mrb_env_unshare(mrb, ci->env); + } ci--; } break; @@ -2582,3 +2586,13 @@ mrb_top_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int sta return v; } + +#if defined(MRB_ENABLE_CXX_EXCEPTION) && defined(__cplusplus) +# if !defined(MRB_ENABLE_CXX_ABI) +} /* end of extern "C" */ +# endif +mrb_int mrb_jmpbuf::jmpbuf_id = 0; +# if !defined(MRB_ENABLE_CXX_ABI) +extern "C" { +# endif +#endif |
