summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/src/vm.c b/src/vm.c
index 043983a05..54877df23 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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