Commit f9b836a6 authored by Masamitsu MURASE's avatar Masamitsu MURASE

Initialize edges of RRange.

parent 9614f134
...@@ -455,9 +455,11 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj) ...@@ -455,9 +455,11 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj)
{ {
struct RRange *r = (struct RRange*)obj; struct RRange *r = (struct RRange*)obj;
if (r->edges) {
mrb_gc_mark_value(mrb, r->edges->beg); mrb_gc_mark_value(mrb, r->edges->beg);
mrb_gc_mark_value(mrb, r->edges->end); mrb_gc_mark_value(mrb, r->edges->end);
} }
}
break; break;
#ifdef ENABLE_REGEXP #ifdef ENABLE_REGEXP
......
...@@ -100,12 +100,15 @@ mrb_range_excl(mrb_state *mrb, mrb_value range) ...@@ -100,12 +100,15 @@ mrb_range_excl(mrb_state *mrb, mrb_value range)
} }
static void 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); struct RRange *r = mrb_range_ptr(range);
range_check(mrb, beg, end); range_check(mrb, beg, end);
r->excl = exclude_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->beg = beg;
r->edges->end = end; r->edges->end = end;
} }
...@@ -408,6 +411,7 @@ mrb_value ...@@ -408,6 +411,7 @@ mrb_value
range_initialize_copy(mrb_state *mrb, mrb_value copy) range_initialize_copy(mrb_state *mrb, mrb_value copy)
{ {
mrb_value src; mrb_value src;
struct RRange *r;
mrb_get_args(mrb, "o", &src); mrb_get_args(mrb, "o", &src);
...@@ -415,7 +419,9 @@ range_initialize_copy(mrb_state *mrb, mrb_value copy) ...@@ -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))) { if (!mrb_obj_is_instance_of(mrb, src, mrb_obj_class(mrb, copy))) {
mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class"); 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; return copy;
} }
...@@ -426,6 +432,8 @@ mrb_init_range(mrb_state *mrb) ...@@ -426,6 +432,8 @@ mrb_init_range(mrb_state *mrb)
struct RClass *r; struct RClass *r;
r = mrb_define_class(mrb, "Range", mrb->object_class); 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_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 */ mrb_define_method(mrb, r, "begin", mrb_range_beg, ARGS_NONE()); /* 15.2.14.4.3 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment