diff --git a/include/mruby/internal.h b/include/mruby/internal.h index a180f6f77..9f8453eaa 100644 --- a/include/mruby/internal.h +++ b/include/mruby/internal.h @@ -144,7 +144,7 @@ mrb_bool mrb_proc_eql(mrb_state *mrb, mrb_value self, mrb_value other); /* range */ #ifdef MRUBY_RANGE_H mrb_value mrb_get_values_at(mrb_state *mrb, mrb_value obj, mrb_int olen, mrb_int argc, const mrb_value *argv, mrb_value (*func)(mrb_state*, mrb_value, mrb_int)); -void mrb_gc_mark_range(mrb_state *mrb, struct RRange *r); +size_t mrb_gc_mark_range(mrb_state *mrb, struct RRange *r); #endif /* string */ diff --git a/src/gc.c b/src/gc.c index 848c95f55..fe2ab5e4b 100644 --- a/src/gc.c +++ b/src/gc.c @@ -687,8 +687,7 @@ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj) break; case MRB_TT_RANGE: - mrb_gc_mark_range(mrb, (struct RRange*)obj); - children+=2; + children += mrb_gc_mark_range(mrb, (struct RRange*)obj); break; case MRB_TT_BREAK: @@ -705,8 +704,10 @@ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj) mrb_gc_mark(mrb, (struct RBasic*)((struct RException*)obj)->mesg); children++; } - mrb_gc_mark(mrb, (struct RBasic*)((struct RException*)obj)->backtrace); - children++; + if (((struct RException*)obj)->backtrace) { + mrb_gc_mark(mrb, (struct RBasic*)((struct RException*)obj)->backtrace); + children++; + } break; case MRB_TT_BACKTRACE: diff --git a/src/range.c b/src/range.c index 367e4c996..cf04ceb31 100644 --- a/src/range.c +++ b/src/range.c @@ -437,13 +437,13 @@ mrb_get_values_at(mrb_state *mrb, mrb_value obj, mrb_int olen, mrb_int argc, con return result; } -void +size_t mrb_gc_mark_range(mrb_state *mrb, struct RRange *r) { - if (RANGE_INITIALIZED_P(r)) { - mrb_gc_mark_value(mrb, RANGE_BEG(r)); - mrb_gc_mark_value(mrb, RANGE_END(r)); - } + if (!RANGE_INITIALIZED_P(r)) return 0; + mrb_gc_mark_value(mrb, RANGE_BEG(r)); + mrb_gc_mark_value(mrb, RANGE_END(r)); + return 2; } MRB_API struct RRange*