* array.c (rb_ary_slice_bang): Be consistent with Array#slice()
and String#slice!(). Just return nil when a negative length or out of boundary index is given instead of raising an exception via internal functions. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16559 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
efa115e451
commit
7c52f1ed7a
@ -1,3 +1,10 @@
|
|||||||
|
Fri May 23 17:55:11 2008 Akinori MUSHA <knu@iDaemons.org>
|
||||||
|
|
||||||
|
* array.c (rb_ary_slice_bang): Be consistent with Array#slice()
|
||||||
|
and String#slice!(). Just return nil when a negative length or
|
||||||
|
out of boundary index is given instead of raising an exception
|
||||||
|
via internal functions.
|
||||||
|
|
||||||
Fri May 23 16:44:34 2008 Akinori MUSHA <knu@iDaemons.org>
|
Fri May 23 16:44:34 2008 Akinori MUSHA <knu@iDaemons.org>
|
||||||
|
|
||||||
* enumerator.c (Init_Enumerator): Override
|
* enumerator.c (Init_Enumerator): Override
|
||||||
|
11
array.c
11
array.c
@ -1803,18 +1803,21 @@ static VALUE
|
|||||||
rb_ary_slice_bang(int argc, VALUE *argv, VALUE ary)
|
rb_ary_slice_bang(int argc, VALUE *argv, VALUE ary)
|
||||||
{
|
{
|
||||||
VALUE arg1, arg2;
|
VALUE arg1, arg2;
|
||||||
long pos, len;
|
long pos, len, orig_len;
|
||||||
|
|
||||||
if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) {
|
if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) {
|
||||||
pos = NUM2LONG(arg1);
|
pos = NUM2LONG(arg1);
|
||||||
len = NUM2LONG(arg2);
|
len = NUM2LONG(arg2);
|
||||||
delete_pos_len:
|
delete_pos_len:
|
||||||
|
if (len < 0) return Qnil;
|
||||||
|
orig_len = RARRAY_LEN(ary);
|
||||||
if (pos < 0) {
|
if (pos < 0) {
|
||||||
pos = RARRAY_LEN(ary) + pos;
|
pos += orig_len;
|
||||||
if (pos < 0) return Qnil;
|
if (pos < 0) return Qnil;
|
||||||
}
|
}
|
||||||
if (RARRAY_LEN(ary) < len || RARRAY_LEN(ary) < pos + len) {
|
else if (orig_len <= pos) return Qnil;
|
||||||
len = RARRAY_LEN(ary) - pos;
|
if (orig_len < pos + len) {
|
||||||
|
len = orig_len - pos;
|
||||||
}
|
}
|
||||||
arg2 = rb_ary_new4(len, RARRAY_PTR(ary)+pos);
|
arg2 = rb_ary_new4(len, RARRAY_PTR(ary)+pos);
|
||||||
RBASIC(arg2)->klass = rb_obj_class(ary);
|
RBASIC(arg2)->klass = rb_obj_class(ary);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user