summaryrefslogtreecommitdiffhomepage
path: root/src/backtrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backtrace.c')
-rw-r--r--src/backtrace.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/backtrace.c b/src/backtrace.c
index 232d1c2f4..f2cf2cd0f 100644
--- a/src/backtrace.c
+++ b/src/backtrace.c
@@ -51,7 +51,7 @@ each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, mrb_code *pc0, each_backtrace_fu
pc = mrb->c->cibase[i].err;
}
else if (i+1 <= ciidx) {
- pc = mrb->c->cibase[i+1].pc - 1;
+ pc = &mrb->c->cibase[i+1].pc[-1];
}
else {
pc = pc0;
@@ -215,11 +215,14 @@ packed_backtrace(mrb_state *mrb)
void
mrb_keep_backtrace(mrb_state *mrb, mrb_value exc)
{
+ mrb_sym sym = mrb_intern_lit(mrb, "backtrace");
mrb_value backtrace;
- int ai = mrb_gc_arena_save(mrb);
+ int ai;
+ if (mrb_iv_defined(mrb, exc, sym)) return;
+ ai = mrb_gc_arena_save(mrb);
backtrace = packed_backtrace(mrb);
- mrb_iv_set(mrb, exc, mrb_intern_lit(mrb, "backtrace"), backtrace);
+ mrb_iv_set(mrb, exc, sym, backtrace);
mrb_gc_arena_restore(mrb, ai);
}