diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/backtrace.c | 13 | ||||
| -rw-r--r-- | src/vm.c | 2 |
2 files changed, 13 insertions, 2 deletions
diff --git a/src/backtrace.c b/src/backtrace.c index a82d8f343..9427c3c8d 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -132,9 +132,18 @@ output_backtrace(mrb_state *mrb, mrb_int ciidx, mrb_code *pc0, output_stream_fun static void exc_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func func, void *stream) { + mrb_value lastpc; + mrb_code *code; + + lastpc = mrb_obj_iv_get(mrb, exc, mrb_intern_lit(mrb, "lastpc")); + if (mrb_nil_p(lastpc)) { + code = NULL; + } else { + code = (mrb_code*)mrb_cptr(lastpc); + } + output_backtrace(mrb, mrb_fixnum(mrb_obj_iv_get(mrb, exc, mrb_intern_lit(mrb, "ciidx"))), - (mrb_code*)mrb_cptr(mrb_obj_iv_get(mrb, exc, mrb_intern_lit(mrb, "lastpc"))), - func, stream); + code, func, stream); } /* mrb_print_backtrace/mrb_get_backtrace: @@ -1514,6 +1514,7 @@ RETRY_TRY_BLOCK: localjump_error(mrb, LOCALJUMP_ERROR_RETURN); goto L_RAISE; } + mrb->c->stack = mrb->c->ci->stackent; mrb->c->ci = ci; break; } @@ -1548,6 +1549,7 @@ RETRY_TRY_BLOCK: c->prev = NULL; } ci = mrb->c->ci; + mrb->c->stack = ci->stackent; mrb->c->ci = mrb->c->cibase + proc->env->cioff + 1; while (ci > mrb->c->ci) { if (ci[-1].acc == CI_ACC_SKIP) { |
