diff options
| author | Paolo Bosetti <[email protected]> | 2012-05-30 22:10:02 -0700 |
|---|---|---|
| committer | Paolo Bosetti <[email protected]> | 2012-05-30 22:10:02 -0700 |
| commit | 6dbba7b799e0cf1a86ec86f347bbc1b40420d372 (patch) | |
| tree | ebbc4d9d1a526833fde0819bcd9a1124be656540 /src/gc.c | |
| parent | 1da34f46f4ff4ddff8f5c525aab13fdfd7eb4a99 (diff) | |
| parent | fae483ff2a91e806e714cb7d118c7bfb8aadbeb2 (diff) | |
| download | mruby-6dbba7b799e0cf1a86ec86f347bbc1b40420d372.tar.gz mruby-6dbba7b799e0cf1a86ec86f347bbc1b40420d372.zip | |
Merge branch 'master' of git://github.com/mruby/mruby into XCode
Diffstat (limited to 'src/gc.c')
| -rw-r--r-- | src/gc.c | 22 |
1 files changed, 17 insertions, 5 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; @@ -499,14 +507,18 @@ 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->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]); + } } } } |
