* 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>
|
||||
|
||||
* 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)
|
||||
{
|
||||
VALUE arg1, arg2;
|
||||
long pos, len;
|
||||
long pos, len, orig_len;
|
||||
|
||||
if (rb_scan_args(argc, argv, "11", &arg1, &arg2) == 2) {
|
||||
pos = NUM2LONG(arg1);
|
||||
len = NUM2LONG(arg2);
|
||||
delete_pos_len:
|
||||
if (len < 0) return Qnil;
|
||||
orig_len = RARRAY_LEN(ary);
|
||||
if (pos < 0) {
|
||||
pos = RARRAY_LEN(ary) + pos;
|
||||
pos += orig_len;
|
||||
if (pos < 0) return Qnil;
|
||||
}
|
||||
if (RARRAY_LEN(ary) < len || RARRAY_LEN(ary) < pos + len) {
|
||||
len = RARRAY_LEN(ary) - pos;
|
||||
else if (orig_len <= pos) return Qnil;
|
||||
if (orig_len < pos + len) {
|
||||
len = orig_len - pos;
|
||||
}
|
||||
arg2 = rb_ary_new4(len, RARRAY_PTR(ary)+pos);
|
||||
RBASIC(arg2)->klass = rb_obj_class(ary);
|
||||
|
Loading…
x
Reference in New Issue
Block a user