static void mark_context(mrb_state *mrb, struct mrb_context *c) { int i, e = 0; mrb_callinfo *ci; /* mark stack */ mark_context_stack(mrb, c); /* mark VM stack */ if (c->cibase) { for (ci = c->cibase; ci <= c->ci; ci++) { if (ci->eidx > e) { e = ci->eidx; } mrb_gc_mark(mrb, (struct RBasic*)ci->env); mrb_gc_mark(mrb, (struct RBasic*)ci->proc); mrb_gc_mark(mrb, (struct RBasic*)ci->target_class); } } /* mark ensure stack */ for (i=0; i<e; i++) { mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]); } /* mark fibers */ if (c->prev && c->prev->fib) { mrb_gc_mark(mrb, (struct RBasic*)c->prev->fib); } }
static void mark_context(mrb_state *mrb, struct mrb_context *c) { int i; mrb_callinfo *ci; if (c->status == MRB_FIBER_TERMINATED) return; /* mark VM stack */ mark_context_stack(mrb, c); /* mark call stack */ if (c->cibase) { for (ci = c->cibase; ci <= c->ci; ci++) { mrb_gc_mark(mrb, (struct RBasic*)ci->env); mrb_gc_mark(mrb, (struct RBasic*)ci->proc); mrb_gc_mark(mrb, (struct RBasic*)ci->target_class); } } /* mark ensure stack */ for (i=0; i<c->esize; i++) { if (c->ensure[i] == NULL) break; mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]); } /* mark fibers */ mrb_gc_mark(mrb, (struct RBasic*)c->fib); if (c->prev) { mark_context(mrb, c->prev); } }
static void mark_context(mrb_state *mrb, struct mrb_context *c) { size_t i; size_t e; mrb_callinfo *ci; /* mark stack */ mark_context_stack(mrb, c); /* mark ensure stack */ e = (c->ci) ? c->ci->eidx : 0; for (i=0; i<e; i++) { mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]); } /* mark closure */ for (ci = c->cibase; ci <= c->ci; ci++) { if (!ci) continue; mrb_gc_mark(mrb, (struct RBasic*)ci->env); mrb_gc_mark(mrb, (struct RBasic*)ci->proc); mrb_gc_mark(mrb, (struct RBasic*)ci->target_class); } if (c->prev && c->prev->fib) { mrb_gc_mark(mrb, (struct RBasic*)c->prev->fib); } }
static void final_marking_phase(mrb_state *mrb) { mark_context_stack(mrb, mrb->root_c); gc_mark_gray_list(mrb); mrb_assert(mrb->gray_list == NULL); mrb->gray_list = mrb->atomic_gray_list; mrb->atomic_gray_list = NULL; gc_mark_gray_list(mrb); mrb_assert(mrb->gray_list == NULL); }
static void final_marking_phase(mrb_state *mrb) { mark_context_stack(mrb, mrb->root_c); while (mrb->gray_list) { if (is_gray(mrb->gray_list)) gc_mark_children(mrb, mrb->gray_list); else mrb->gray_list = mrb->gray_list->gcnext; } gc_assert(mrb->gray_list == NULL); mrb->gray_list = mrb->variable_gray_list; mrb->variable_gray_list = NULL; while (mrb->gray_list) { if (is_gray(mrb->gray_list)) gc_mark_children(mrb, mrb->gray_list); else mrb->gray_list = mrb->gray_list->gcnext; } gc_assert(mrb->gray_list == NULL); }