diff options
| -rw-r--r-- | include/mruby/khash.h | 4 | ||||
| -rw-r--r-- | src/dump.c | 1 | ||||
| -rw-r--r-- | src/gc.c | 17 | ||||
| -rw-r--r-- | src/range.c | 24 |
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) { @@ -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 */ |
