diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-02-02 11:38:20 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-02-02 11:38:20 +0000 |
commit | 765255b737235a65daea6679c4672541bb67ecb4 (patch) | |
tree | 5ea517fae24a858cd204bbbe20e6d695c6472eae /array.c | |
parent | e9f9915a4c305ac02d8634b14579119433bc7b43 (diff) |
* array.c (rb_ary_sort_bang): returns self, even if its length is
less than 2.
* eval.c (POP_VARS): propagate DVAR_DONT_RECYCLE, if
SCOPE_DONT_RECYCLE of ruby_scope is set.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1156 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 28 |
1 files changed, 25 insertions, 3 deletions
@@ -384,7 +384,7 @@ rb_ary_entry(ary, offset) if (RARRAY(ary)->len == 0) return Qnil; if (offset < 0) { - offset = RARRAY(ary)->len + offset; + offset += RARRAY(ary)->len; } if (offset < 0 || RARRAY(ary)->len <= offset) { return Qnil; @@ -431,7 +431,7 @@ rb_ary_aref(argc, argv, ary) beg = NUM2LONG(arg1); len = NUM2LONG(arg2); if (beg < 0) { - beg = RARRAY(ary)->len + beg; + beg += RARRAY(ary)->len; } return rb_ary_subseq(ary, beg, len); } @@ -481,6 +481,27 @@ rb_ary_last(ary) } static VALUE +rb_ary_fetch(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + VALUE pos, ifnone; + long idx; + + rb_scan_args(argc, argv, "11", &pos, &ifnone); + idx = NUM2LONG(pos); + + if (idx < 0) { + idx += RARRAY(ary)->len; + } + if (idx < 0 || RARRAY(ary)->len <= idx) { + return ifnone; + } + return RARRAY(ary)->ptr[idx]; +} + +static VALUE rb_ary_index(ary, val) VALUE ary; VALUE val; @@ -979,7 +1000,7 @@ rb_ary_sort_bang(ary) VALUE ary; { rb_ary_modify(ary); - if (RARRAY(ary)->len <= 1) return Qnil; + if (RARRAY(ary)->len <= 1) return ary; FL_SET(ary, ARY_TMPLOCK); /* prohibit modification during sort */ rb_ensure(sort_internal, ary, sort_unlock, ary); @@ -1649,6 +1670,7 @@ Init_Array() rb_define_method(rb_cArray, "[]", rb_ary_aref, -1); rb_define_method(rb_cArray, "[]=", rb_ary_aset, -1); rb_define_method(rb_cArray, "at", rb_ary_at, 1); + rb_define_method(rb_cArray, "fetch", rb_ary_fetch, -1); rb_define_method(rb_cArray, "first", rb_ary_first, 0); rb_define_method(rb_cArray, "last", rb_ary_last, 0); rb_define_method(rb_cArray, "concat", rb_ary_concat, 1); |