summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/gc.c19
-rw-r--r--src/load.c3
2 files changed, 16 insertions, 6 deletions
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; 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++) {