summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1999-02-24 04:31:29 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1999-02-24 04:31:29 +0000
commit3976feed73bf4ec27183824870ee077c2b5b00b1 (patch)
treecb461ab9246a2c8e13d373a8c2d2e6378e4db9cc /array.c
parent51fa86ece2d2b0f72c86c70fe1314e412c7a9e68 (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.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/array.c b/array.c
index 8b0d379999..8b25b9c1b3 100644
--- a/array.c
+++ b/array.c
@@ -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;
}