From e92d4e2680716d3e16a264e46394cb6e458699f9 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 7 Nov 2013 03:54:22 +0900 Subject: modified to use irep->reps to reference child ireps. preparation for removing irep array from mrb_state. note that instructions OP_LAMBDA, OP_EXEC and OP_EPUSH are incompatible, and dumped mrb format has changed. --- src/gc.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'src/gc.c') diff --git a/src/gc.c b/src/gc.c index ccd925da8..e8dce1fdf 100644 --- a/src/gc.c +++ b/src/gc.c @@ -470,6 +470,31 @@ mark_context(mrb_state *mrb, struct mrb_context *c) } } +static size_t +mark_irep_pool_size(mrb_state *mrb, mrb_irep *irep) +{ + size_t size = irep->plen; + size_t i; + + for (i=0; irlen; i++) { + size += mark_irep_pool_size(mrb, irep->reps[i]); + } + return size; +} + +static void +mark_irep_pool(mrb_state *mrb, mrb_irep *irep) +{ + size_t i; + + for (i=0; iplen; i++) { + mrb_gc_mark_value(mrb, irep->pool[i]); + } + for (i=0; irlen; i++) { + mark_irep_pool(mrb, irep->reps[i]); + } +} + static void gc_mark_children(mrb_state *mrb, struct RBasic *obj) { @@ -504,6 +529,9 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj) mrb_gc_mark(mrb, (struct RBasic*)p->env); mrb_gc_mark(mrb, (struct RBasic*)p->target_class); + if (!MRB_PROC_CFUNC_P(p)) { + mark_irep_pool(mrb, p->body.irep); + } } break; @@ -771,6 +799,10 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj) break; case MRB_TT_PROC: + if (!MRB_PROC_CFUNC_P((struct RProc*)obj)) { + children += mark_irep_pool_size(mrb, ((struct RProc*)obj)->body.irep); + } + /* fall through */ case MRB_TT_RANGE: children+=2; break; -- cgit v1.2.3