diff options
Diffstat (limited to 'src/array.c')
| -rw-r--r-- | src/array.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/array.c b/src/array.c index 85481fe9e..ad0d5b8db 100644 --- a/src/array.c +++ b/src/array.c @@ -631,11 +631,13 @@ mrb_ary_unshift_m(mrb_state *mrb, mrb_value self) ptr = a->as.heap.ptr; } else { + mrb_bool same = vals == ARY_PTR(a); ary_modify(mrb, a); if (ARY_CAPA(a) < len + alen) ary_expand_capa(mrb, a, len + alen); ptr = ARY_PTR(a); value_move(ptr + alen, ptr, len); + if (same) vals = ptr; } array_copy(ptr, vals, alen); ARY_SET_LEN(a, len+alen); @@ -730,6 +732,10 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val argv = ARY_PTR(r); } } + else if (mrb_undef_p(rpl)) { + argc = 0; + argv = NULL; + } else { argc = 1; argv = &rpl; @@ -802,6 +808,13 @@ ary_subseq(mrb_state *mrb, struct RArray *a, mrb_int beg, mrb_int len) return mrb_obj_value(b); } +mrb_value +mrb_ary_subseq(mrb_state *mrb, mrb_value ary, mrb_int beg, mrb_int len) +{ + struct RArray *a = mrb_ary_ptr(ary); + return ary_subseq(mrb, a, beg, len); +} + static mrb_int aget_index(mrb_state *mrb, mrb_value index) { @@ -1302,6 +1315,7 @@ init_ary_each(mrb_state *mrb, struct RClass *ary) each_irep->nregs = 7; each_irep->nlocals = 3; p = mrb_proc_new(mrb, each_irep); + p->flags |= MRB_PROC_SCOPE | MRB_PROC_STRICT; MRB_METHOD_FROM_PROC(m, p); mrb_define_method_raw(mrb, ary, mrb_intern_lit(mrb, "each"), m); } |
