diff options
| author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-04-20 22:09:30 +0000 |
|---|---|---|
| committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-04-20 22:09:30 +0000 |
| commit | a30fe360801875148fc68a338583eacbe54737ab (patch) | |
| tree | 8fd18d869923b15e7e746a70d031d4c0ed94bce7 | |
| parent | bc030452b777d0c71e8a34ad84f6663a8ad72557 (diff) | |
| download | ruby-a30fe360801875148fc68a338583eacbe54737ab.tar.gz ruby-a30fe360801875148fc68a338583eacbe54737ab.tar.xz ruby-a30fe360801875148fc68a338583eacbe54737ab.zip | |
* array.c (rb_ary_push): bypass rb_ary_store().
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@23239 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
| -rw-r--r-- | ChangeLog | 4 | ||||
| -rw-r--r-- | array.c | 9 |
2 files changed, 12 insertions, 1 deletions
@@ -1,3 +1,7 @@ +Tue Apr 21 07:07:45 2009 Yukihiro Matsumoto <matz@ruby-lang.org> + + * array.c (rb_ary_push): bypass rb_ary_store(). + Tue Apr 21 01:25:16 2009 Yukihiro Matsumoto <matz@ruby-lang.org> * bignum.c (bigsub_int): subtraction without making internal @@ -697,7 +697,14 @@ ary_take_first_or_last(int argc, VALUE *argv, VALUE ary, enum ary_take_pos_flags VALUE rb_ary_push(VALUE ary, VALUE item) { - rb_ary_store(ary, RARRAY_LEN(ary), item); + long idx = RARRAY_LEN(ary); + + rb_ary_modify(ary); + if (idx >= ARY_CAPA(ary)) { + ary_double_capa(ary, idx); + } + RARRAY_PTR(ary)[idx] = item; + ARY_SET_LEN(ary, idx + 1); return ary; } |
