diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-09-08 07:33:08 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-09-08 07:33:08 +0900 |
| commit | e4a0728b24831dbe83e3210cefb345d991ebccc6 (patch) | |
| tree | 572648903ebb94fc2cbbf2f67b885330521e6038 /src | |
| parent | 1d1a89874fe757382b0137cbd102bdf6fb243340 (diff) | |
| download | mruby-e4a0728b24831dbe83e3210cefb345d991ebccc6.tar.gz mruby-e4a0728b24831dbe83e3210cefb345d991ebccc6.zip | |
array.c: refactor `mrb_ary_splice`.
Diffstat (limited to 'src')
| -rw-r--r-- | src/array.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/src/array.c b/src/array.c index ae7c87bbc..fc3b0a087 100644 --- a/src/array.c +++ b/src/array.c @@ -744,9 +744,9 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val head += alen; if (head < 0) goto out_of_range; } - if (head > MRB_INT_MAX - len) { + if (head > ARY_MAX_SIZE - len) { out_of_range: - mrb_raise(mrb, E_INDEX_ERROR, "index is out of array"); + mrb_raisef(mrb, E_INDEX_ERROR, "index %i is out of array", head); } tail = head + len; if (alen < len || alen < tail) { @@ -776,12 +776,10 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val argv = &rpl; } if (head >= alen) { - if (head > ARY_MAX_SIZE - argc) { - mrb_raisef(mrb, E_INDEX_ERROR, "index %i too big", head); - } + if (head > ARY_MAX_SIZE - argc) goto out_of_range; len = head + argc; if (len > ARY_CAPA(a)) { - ary_expand_capa(mrb, a, head + argc); + ary_expand_capa(mrb, a, len); } ary_fill_with_nil(ARY_PTR(a) + alen, head - alen); if (argc > 0) { @@ -793,7 +791,8 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val mrb_int newlen; if (alen - len > ARY_MAX_SIZE - argc) { - mrb_raisef(mrb, E_INDEX_ERROR, "index %i too big", alen + argc - len); + head = alen + argc - len; + goto out_of_range; } newlen = alen + argc - len; if (newlen > ARY_CAPA(a)) { @@ -802,7 +801,6 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val if (len != argc) { mrb_value *ptr = ARY_PTR(a); - tail = head + len; value_move(ptr + head + argc, ptr + tail, alen - tail); ARY_SET_LEN(a, newlen); } |
