From c2f427c5ed71dd69850442ee5d3b855028c78acf Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 30 May 2012 14:44:33 +0900 Subject: mark ci->proc as well --- src/gc.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/gc.c') diff --git a/src/gc.c b/src/gc.c index 0ba6e3e76..cf6dd35ef 100644 --- a/src/gc.c +++ b/src/gc.c @@ -500,6 +500,7 @@ root_scan_phase(mrb_state *mrb) for (ci = mrb->cibase; ci <= mrb->ci; ci++) { if (!ci) continue; mrb_gc_mark( mrb, (struct RBasic*)ci->env); + mrb_gc_mark( mrb, (struct RBasic*)ci->proc); } /* mark irep pool */ for (i=0; iirep_len; i++) { -- cgit v1.2.3 From b662a12ee5cda85209c1c9d64cd78fee425ef413 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 30 May 2012 14:51:39 +0900 Subject: remove spaces after open paren --- src/gc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/gc.c') diff --git a/src/gc.c b/src/gc.c index cf6dd35ef..1ae70a375 100644 --- a/src/gc.c +++ b/src/gc.c @@ -499,8 +499,8 @@ root_scan_phase(mrb_state *mrb) /* mark closure */ for (ci = mrb->cibase; ci <= mrb->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->env); + mrb_gc_mark(mrb, (struct RBasic*)ci->proc); } /* mark irep pool */ for (i=0; iirep_len; i++) { -- cgit v1.2.3 From e5d1dd2a8eebf4500bcbf319e264a08b99c788d7 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Wed, 30 May 2012 16:01:48 +0900 Subject: MRB_GC_STRESS for GC test --- src/gc.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'src/gc.c') diff --git a/src/gc.c b/src/gc.c index 1ae70a375..999a1a7d2 100644 --- a/src/gc.c +++ b/src/gc.c @@ -247,6 +247,9 @@ mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls) { struct RBasic *p; +#ifdef MRB_GC_STRESS + mrb_garbage_collect(mrb); +#endif if (mrb->gc_threshold < mrb->live) { mrb_incremental_gc(mrb); } @@ -277,6 +280,11 @@ mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls) static inline void add_gray_list(mrb_state *mrb, struct RBasic *obj) { +#ifdef MRB_GC_STRESS + if (obj->tt > MRB_TT_MAXDEFINE) { + abort(); + } +#endif paint_gray(obj); obj->gcnext = mrb->gray_list; mrb->gray_list = obj; @@ -501,13 +509,16 @@ root_scan_phase(mrb_state *mrb) 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); } /* mark irep pool */ for (i=0; iirep_len; i++) { - mrb_irep *irep = mrb->irep[i]; - if (!irep) continue; - for (j=0; jplen; j++) { - mrb_gc_mark_value(mrb, irep->pool[j]); + if (mrb->irep) { + mrb_irep *irep = mrb->irep[i]; + if (!irep) continue; + for (j=0; jplen; j++) { + mrb_gc_mark_value(mrb, irep->pool[j]); + } } } } -- cgit v1.2.3