diff options
| author | Masamitsu MURASE <[email protected]> | 2013-01-13 19:30:25 +0900 |
|---|---|---|
| committer | Masamitsu MURASE <[email protected]> | 2013-01-13 22:04:45 +0900 |
| commit | f9b836a677574f381bacfb80c50842a6ef9ef72f (patch) | |
| tree | d212c242419de03b2827b084a8be2af13cb6e559 | |
| parent | 9614f134879f58ee3532e3e7dd4d75814fbc73ee (diff) | |
| download | mruby-f9b836a677574f381bacfb80c50842a6ef9ef72f.tar.gz mruby-f9b836a677574f381bacfb80c50842a6ef9ef72f.zip | |
Initialize edges of RRange.
| -rw-r--r-- | src/gc.c | 6 | ||||
| -rw-r--r-- | src/range.c | 12 |
2 files changed, 14 insertions, 4 deletions
@@ -455,8 +455,10 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj) { struct RRange *r = (struct RRange*)obj; - mrb_gc_mark_value(mrb, r->edges->beg); - mrb_gc_mark_value(mrb, r->edges->end); + if (r->edges) { + mrb_gc_mark_value(mrb, r->edges->beg); + mrb_gc_mark_value(mrb, r->edges->end); + } } break; diff --git a/src/range.c b/src/range.c index 085d5b1c0..8f12b802b 100644 --- a/src/range.c +++ b/src/range.c @@ -100,12 +100,15 @@ mrb_range_excl(mrb_state *mrb, mrb_value range) } static void -range_init(mrb_state *mrb, mrb_value range, mrb_value beg, mrb_value end, mrb_int exclude_end) +range_init(mrb_state *mrb, mrb_value range, mrb_value beg, mrb_value end, int exclude_end) { struct RRange *r = mrb_range_ptr(range); range_check(mrb, beg, end); r->excl = exclude_end; + if (!r->edges) { + r->edges = (struct mrb_range_edges *)mrb_malloc(mrb, sizeof(struct mrb_range_edges)); + } r->edges->beg = beg; r->edges->end = end; } @@ -408,6 +411,7 @@ mrb_value range_initialize_copy(mrb_state *mrb, mrb_value copy) { mrb_value src; + struct RRange *r; mrb_get_args(mrb, "o", &src); @@ -415,7 +419,9 @@ range_initialize_copy(mrb_state *mrb, mrb_value copy) if (!mrb_obj_is_instance_of(mrb, src, mrb_obj_class(mrb, copy))) { mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class"); } - *mrb_range_ptr(copy) = *mrb_range_ptr(src); + + r = mrb_range_ptr(src); + range_init(mrb, copy, r->edges->beg, r->edges->end, r->excl); return copy; } @@ -426,6 +432,8 @@ mrb_init_range(mrb_state *mrb) struct RClass *r; r = mrb_define_class(mrb, "Range", mrb->object_class); + MRB_SET_INSTANCE_TT(r, MRB_TT_RANGE); + mrb_include_module(mrb, r, mrb_class_get(mrb, "Enumerable")); mrb_define_method(mrb, r, "begin", mrb_range_beg, ARGS_NONE()); /* 15.2.14.4.3 */ |
