diff --git a/src/gc.c b/src/gc.c index 8bd8243f10..e074cc9767 100644 --- a/src/gc.c +++ b/src/gc.c @@ -514,10 +514,27 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj) case MRB_TT_OBJECT: case MRB_TT_DATA: - case MRB_TT_EXCEPTION: mrb_gc_mark_iv(mrb, (struct RObject*)obj); break; + case MRB_TT_EXCEPTION: + { + mrb_int i, ciidx; + + mrb_gc_mark_iv(mrb, (struct RObject*)obj); + + ciidx = mrb_fixnum(mrb_obj_iv_get(mrb, (struct RObject*)obj, + mrb_intern_lit(mrb, "ciidx"))); + for (i = 0; i <= ciidx; i++) { + mrb_callinfo *ci = &mrb->c->cibase[i]; + if (!ci->proc) { + continue; + } + mrb_gc_mark(mrb, (struct RBasic*)ci->proc); + } + } + break; + case MRB_TT_PROC: { struct RProc *p = (struct RProc*)obj;