diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-02-24 04:31:29 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-02-24 04:31:29 +0000 |
commit | 3976feed73bf4ec27183824870ee077c2b5b00b1 (patch) | |
tree | cb461ab9246a2c8e13d373a8c2d2e6378e4db9cc /array.c | |
parent | 51fa86ece2d2b0f72c86c70fe1314e412c7a9e68 (diff) |
990224
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_3@405 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 20 |
1 files changed, 15 insertions, 5 deletions
@@ -355,8 +355,9 @@ rb_ary_subseq(ary, beg, len) { VALUE ary2; - if (len <= 0) { - return rb_ary_new2(0); + if (len == 0) return rb_ary_new2(0); + if (len < 0) { + rb_raise(rb_eIndexError, "negative length %d", len); } if (beg < 0) { len += beg; @@ -393,17 +394,20 @@ beg_len(range, begp, lenp, len) if (end < 0) { end = len + end; } + *begp = beg; if (beg > end) { + if (e == -1) { + *lenp = 0; + return Qtrue; + } rb_raise(rb_eIndexError, "end smaller than beg [%d..%d]", b, e); } - *begp = beg; if (beg > len) { *lenp = 0; } else { - len = end - beg +1; - *lenp = len; + *lenp = end - beg + 1; } return Qtrue; } @@ -555,6 +559,9 @@ rb_ary_aset(argc, argv, ary) if (beg < 0) { beg = RARRAY(ary)->len + beg; } +#ifdef INABA + if (len < 0) return Qnil; +#endif rb_ary_replace(ary, beg, len, arg3); return arg3; } @@ -564,6 +571,9 @@ rb_ary_aset(argc, argv, ary) } else if (beg_len(arg1, &beg, &len, RARRAY(ary)->len)) { /* check if idx is Range */ +#ifdef INABA + if (len < 0) return Qnil; +#endif rb_ary_replace(ary, beg, len, arg2); return arg2; } |