summaryrefslogtreecommitdiffhomepage
path: root/src/gc.c
diff options
context:
space:
mode:
authorPaolo Bosetti <[email protected]>2012-05-30 22:10:02 -0700
committerPaolo Bosetti <[email protected]>2012-05-30 22:10:02 -0700
commit6dbba7b799e0cf1a86ec86f347bbc1b40420d372 (patch)
treeebbc4d9d1a526833fde0819bcd9a1124be656540 /src/gc.c
parent1da34f46f4ff4ddff8f5c525aab13fdfd7eb4a99 (diff)
parentfae483ff2a91e806e714cb7d118c7bfb8aadbeb2 (diff)
downloadmruby-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.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/gc.c b/src/gc.c
index 0ba6e3e76..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;
@@ -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]);
+ }
}
}
}