diff options
| -rw-r--r-- | src/gc.c | 19 | ||||
| -rw-r--r-- | src/load.c | 3 |
2 files changed, 16 insertions, 6 deletions
@@ -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; i<mrb->irep_len; i++) { - mrb_irep *irep = mrb->irep[i]; - if (!irep) continue; - for (j=0; j<irep->plen; j++) { - mrb_gc_mark_value(mrb, irep->pool[j]); + if (mrb->irep) { + mrb_irep *irep = mrb->irep[i]; + if (!irep) continue; + for (j=0; j<irep->plen; j++) { + mrb_gc_mark_value(mrb, irep->pool[j]); + } } } } diff --git a/src/load.c b/src/load.c index e73f09b3a..28f52433a 100644 --- a/src/load.c +++ b/src/load.c @@ -531,14 +531,13 @@ mrb_read_irep(mrb_state *mrb, const char *bin) src += MRB_DUMP_SIZE_OF_LONG; //record ren if ((ret = read_rite_irep_record(mrb, src, mrb->irep[i], &len)) != MRB_DUMP_OK) goto error_exit; - mrb->irep[i]->idx = i; + mrb->irep[mrb->irep_len++]->idx = i; src += len; } if (0 != bin_to_uint32(src)) { //dummy record len ret = MRB_DUMP_GENERAL_FAILURE; } - mrb->irep_len += nirep; error_exit: if (ret != MRB_DUMP_OK) { for (n=0,i=sirep; n<nirep; n++,i++) { |
