summaryrefslogtreecommitdiffhomepage
path: root/src/gc.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-11-07 03:54:22 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-11-07 03:54:22 +0900
commite92d4e2680716d3e16a264e46394cb6e458699f9 (patch)
tree4b0a9bb35ba4e75126436ce71ad5ece67b7193cd /src/gc.c
parentf80401de6c9b7dd9e0676c4414aae7a6e033ac5f (diff)
downloadmruby-e92d4e2680716d3e16a264e46394cb6e458699f9.tar.gz
mruby-e92d4e2680716d3e16a264e46394cb6e458699f9.zip
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.
Diffstat (limited to 'src/gc.c')
-rw-r--r--src/gc.c32
1 files changed, 32 insertions, 0 deletions
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; i<irep->rlen; 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; i<irep->plen; i++) {
+ mrb_gc_mark_value(mrb, irep->pool[i]);
+ }
+ for (i=0; i<irep->rlen; 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;