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