summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/mruby/khash.h4
-rw-r--r--src/dump.c1
-rw-r--r--src/gc.c17
-rw-r--r--src/range.c24
4 files changed, 30 insertions, 16 deletions
diff --git a/include/mruby/khash.h b/include/mruby/khash.h
index ad03b1fad..dc298baf1 100644
--- a/include/mruby/khash.h
+++ b/include/mruby/khash.h
@@ -45,7 +45,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
/* declare struct kh_xxx and kh_xxx_funcs
- name: ash name
+ name: hash name
khkey_t: key data type
khval_t: value data type
kh_is_map: (not implemented / not used in RiteVM)
@@ -77,7 +77,7 @@ static const uint8_t __m[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
/* define kh_xxx_funcs
- name: ash name
+ name: hash name
khkey_t: key data type
khval_t: value data type
kh_is_map: (not implemented / not used in RiteVM)
diff --git a/src/dump.c b/src/dump.c
index 2d70c2802..884a9141f 100644
--- a/src/dump.c
+++ b/src/dump.c
@@ -507,6 +507,7 @@ calc_crc_section(mrb_state *mrb, mrb_irep *irep, uint16_t *crc, int section)
result = write_syms_block(mrb, irep, buf, type);
break;
default:
+ result = MRB_DUMP_GENERAL_FAILURE;
break; /* Already checked above. */
}
if (result < 0) {
diff --git a/src/gc.c b/src/gc.c
index b3e4b291c..d84f44377 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -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;
@@ -780,7 +782,7 @@ incremental_sweep_phase(mrb_state *mrb, size_t limit)
}
}
else {
- if (!is_minor_gc(mrb))
+ if (!is_generational(mrb))
paint_partial_white(mrb, &p->as.basic); /* next gc target */
dead_slot = 0;
}
@@ -863,11 +865,10 @@ clear_all_old(mrb_state *mrb)
if (is_major_gc(mrb)) {
advance_phase(mrb, GC_STATE_NONE);
}
- else {
- mrb->is_generational_gc_mode = FALSE;
- prepare_incremental_sweep(mrb);
- advance_phase(mrb, GC_STATE_NONE);
- }
+
+ mrb->is_generational_gc_mode = FALSE;
+ prepare_incremental_sweep(mrb);
+ advance_phase(mrb, GC_STATE_NONE);
mrb->variable_gray_list = mrb->gray_list = NULL;
mrb->is_generational_gc_mode = origin_mode;
}
diff --git a/src/range.c b/src/range.c
index 085d5b1c0..ef92ed822 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;
}
@@ -122,11 +125,15 @@ mrb_value
mrb_range_initialize(mrb_state *mrb, mrb_value range)
{
mrb_value beg, end;
- mrb_value flags;
+ int exclusive;
+ int n;
- mrb_get_args(mrb, "ooo", &beg, &end, &flags);
+ n = mrb_get_args(mrb, "oo|b", &beg, &end, &exclusive);
+ if (n != 3) {
+ exclusive = 0;
+ }
/* Ranges are immutable, so that they should be initialized only once. */
- range_init(mrb, range, beg, end, mrb_test(flags));
+ range_init(mrb, range, beg, end, exclusive);
return range;
}
/*
@@ -408,6 +415,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 +423,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 +436,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 */
@@ -436,7 +448,7 @@ mrb_init_range(mrb_state *mrb)
mrb_define_method(mrb, r, "exclude_end?", mrb_range_excl, ARGS_NONE()); /* 15.2.14.4.6 */
mrb_define_method(mrb, r, "first", mrb_range_beg, ARGS_NONE()); /* 15.2.14.4.7 */
mrb_define_method(mrb, r, "include?", mrb_range_include, ARGS_REQ(1)); /* 15.2.14.4.8 */
- mrb_define_method(mrb, r, "initialize", mrb_range_initialize, ARGS_REQ(4)); /* 15.2.14.4.9 */
+ mrb_define_method(mrb, r, "initialize", mrb_range_initialize, ARGS_ANY()); /* 15.2.14.4.9 */
mrb_define_method(mrb, r, "last", mrb_range_end, ARGS_NONE()); /* 15.2.14.4.10 */
mrb_define_method(mrb, r, "member?", mrb_range_include, ARGS_REQ(1)); /* 15.2.14.4.11 */