Commit b4d946f6 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #3129 from kou/fix-segv-by-backtrace-and-gc

Fix SEGV by backtrace and GC
parents 1a4540fb f1eb3aea
...@@ -112,8 +112,6 @@ each_backtrace(mrb_state *mrb, mrb_int ciidx, mrb_code *pc0, each_backtrace_func ...@@ -112,8 +112,6 @@ each_backtrace(mrb_state *mrb, mrb_int ciidx, mrb_code *pc0, each_backtrace_func
mrb_irep *irep; mrb_irep *irep;
mrb_code *pc; mrb_code *pc;
loc.lineno = -1;
ci = &mrb->c->cibase[i]; ci = &mrb->c->cibase[i];
if (!ci->proc) continue; if (!ci->proc) continue;
...@@ -130,11 +128,8 @@ each_backtrace(mrb_state *mrb, mrb_int ciidx, mrb_code *pc0, each_backtrace_func ...@@ -130,11 +128,8 @@ each_backtrace(mrb_state *mrb, mrb_int ciidx, mrb_code *pc0, each_backtrace_func
else { else {
pc = pc0; pc = pc0;
} }
if (irep) {
loc.filename = mrb_debug_get_filename(irep, (uint32_t)(pc - irep->iseq)); loc.filename = mrb_debug_get_filename(irep, (uint32_t)(pc - irep->iseq));
loc.lineno = mrb_debug_get_line(irep, (uint32_t)(pc - irep->iseq)); loc.lineno = mrb_debug_get_line(irep, (uint32_t)(pc - irep->iseq));
}
if (loc.lineno == -1) continue; if (loc.lineno == -1) continue;
......
...@@ -255,17 +255,22 @@ mrb_exc_set(mrb_state *mrb, mrb_value exc) ...@@ -255,17 +255,22 @@ mrb_exc_set(mrb_state *mrb, mrb_value exc)
{ {
if (!mrb->gc.out_of_memory && mrb->backtrace.n > 0) { if (!mrb->gc.out_of_memory && mrb->backtrace.n > 0) {
mrb_value target_exc = mrb_nil_value(); mrb_value target_exc = mrb_nil_value();
int ai;
ai = mrb_gc_arena_save(mrb);
if ((mrb->exc && !have_backtrace(mrb, mrb->exc))) { if ((mrb->exc && !have_backtrace(mrb, mrb->exc))) {
target_exc = mrb_obj_value(mrb->exc); target_exc = mrb_obj_value(mrb->exc);
} }
else if (!mrb_nil_p(exc) && mrb_obj_ptr(exc) == mrb->backtrace.exc) { else if (!mrb_nil_p(exc) && mrb->backtrace.exc) {
target_exc = exc; target_exc = mrb_obj_value(mrb->backtrace.exc);
mrb_gc_protect(mrb, target_exc);
} }
if (!mrb_nil_p(target_exc)) { if (!mrb_nil_p(target_exc)) {
mrb_value backtrace; mrb_value backtrace;
backtrace = mrb_restore_backtrace(mrb); backtrace = mrb_restore_backtrace(mrb);
set_backtrace(mrb, target_exc, backtrace); set_backtrace(mrb, target_exc, backtrace);
} }
mrb_gc_arena_restore(mrb, ai);
} }
mrb->backtrace.n = 0; mrb->backtrace.n = 0;
......
...@@ -695,8 +695,13 @@ obj_free(mrb_state *mrb, struct RBasic *obj) ...@@ -695,8 +695,13 @@ obj_free(mrb_state *mrb, struct RBasic *obj)
#endif #endif
case MRB_TT_OBJECT: case MRB_TT_OBJECT:
mrb_gc_free_iv(mrb, (struct RObject*)obj);
break;
case MRB_TT_EXCEPTION: case MRB_TT_EXCEPTION:
mrb_gc_free_iv(mrb, (struct RObject*)obj); mrb_gc_free_iv(mrb, (struct RObject*)obj);
if ((struct RObject*)obj == mrb->backtrace.exc)
mrb->backtrace.exc = 0;
break; break;
case MRB_TT_CLASS: case MRB_TT_CLASS:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment