summaryrefslogtreecommitdiffhomepage
path: root/src/array.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-01-23 14:35:26 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-01-23 14:35:26 +0900
commit5e1d923381072ebcbe002d70bc198a6e95c31f50 (patch)
treea34b1dd90e3931d91d4cc11666187907f10de877 /src/array.c
parent708088c5fafd469d04a1b428fc49b8b7c27607d2 (diff)
downloadmruby-5e1d923381072ebcbe002d70bc198a6e95c31f50.tar.gz
mruby-5e1d923381072ebcbe002d70bc198a6e95c31f50.zip
Changed the behavior of mrb_range_beg_len(); close #3411
The new API is: int mrb_range_beg_len(mrb, range, &beg, &len, len, trunc) The new argument `trunc` is a boolean value that specifies whether the function truncates the range. The new return value is an integer instead of a boolean, that is: 0: not a range 1: range with proper edges 2: out of range To get the old behavior, you have to rewrite: mrb_range_beg_len(mrb, range, &beg, &len, len) to: mrn_range_beg_len(mrb, range, &beg, &len, len, TRUE) == 1 [Breaking Change]
Diffstat (limited to 'src/array.c')
-rw-r--r--src/array.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/src/array.c b/src/array.c
index f9155d173..e41183d68 100644
--- a/src/array.c
+++ b/src/array.c
@@ -742,7 +742,7 @@ mrb_ary_aget(mrb_state *mrb, mrb_value self)
switch (mrb_type(index)) {
/* a[n..m] */
case MRB_TT_RANGE:
- if (mrb_range_beg_len(mrb, index, &i, &len, a->len)) {
+ if (mrb_range_beg_len(mrb, index, &i, &len, a->len, TRUE) == 1) {
return ary_subseq(mrb, a, i, len);
}
else {
@@ -808,19 +808,16 @@ mrb_ary_aset(mrb_state *mrb, mrb_value self)
mrb_ary_modify(mrb, mrb_ary_ptr(self));
if (mrb_get_args(mrb, "oo|o", &v1, &v2, &v3) == 2) {
- switch (mrb_type(v1)) {
/* a[n..m] = v */
- case MRB_TT_RANGE:
- if (mrb_range_beg_len(mrb, v1, &i, &len, RARRAY_LEN(self))) {
- mrb_ary_splice(mrb, self, i, len, v2);
- }
+ switch (mrb_range_beg_len(mrb, v1, &i, &len, RARRAY_LEN(self), FALSE)) {
+ case 0: /* not range */
+ mrb_ary_set(mrb, self, aget_index(mrb, v1), v2);
break;
- /* a[n] = v */
- case MRB_TT_FIXNUM:
- mrb_ary_set(mrb, self, mrb_fixnum(v1), v2);
+ case 1: /* range */
+ mrb_ary_splice(mrb, self, i, len, v2);
break;
- default:
- mrb_ary_set(mrb, self, aget_index(mrb, v1), v2);
+ case 2: /* out of range */
+ mrb_raisef(mrb, E_RANGE_ERROR, "%S out of range", v1);
break;
}
return v2;