diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-11-15 05:42:36 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-11-15 05:42:36 +0000 |
commit | 956296495b58e9a39cb8179f941ad7a8699b7be8 (patch) | |
tree | 10e2fc8f2c4a3e08ca402a31ec3248db47237961 /array.c | |
parent | a1fe60779bb4fc4aa893ac830874510aff5cd82d (diff) | |
download | ruby-956296495b58e9a39cb8179f941ad7a8699b7be8.tar.gz |
* array.c (rb_ary_fill): should adjust array length correctly when
an array is expanded in the fill process. [ruby-core:06625]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9539 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 8 |
1 files changed, 4 insertions, 4 deletions
@@ -1100,6 +1100,7 @@ rb_ary_insert(int argc, VALUE *argv, VALUE ary) { long pos; + if (argc == 1) return ary; if (argc < 1) { rb_raise(rb_eArgError, "wrong number of arguments (at least 1)"); } @@ -1107,11 +1108,9 @@ rb_ary_insert(int argc, VALUE *argv, VALUE ary) if (pos == -1) { pos = RARRAY(ary)->len; } - else if (pos < 0) { + if (pos < 0) { pos++; } - - if (argc == 1) return ary; rb_ary_splice(ary, pos, 0, rb_ary_new4(argc - 1, argv + 1)); return ary; } @@ -2141,7 +2140,6 @@ rb_ary_fill(int argc, VALUE *argv, VALUE ary) if (beg > RARRAY(ary)->len) { rb_mem_clear(RARRAY(ary)->ptr + RARRAY(ary)->len, end - RARRAY(ary)->len); } - RARRAY(ary)->len = end; } if (block_p) { @@ -2152,9 +2150,11 @@ rb_ary_fill(int argc, VALUE *argv, VALUE ary) v = rb_yield(LONG2NUM(i)); if (i>=RARRAY(ary)->len) break; RARRAY(ary)->ptr[i] = v; + RARRAY(ary)->len = i+1; } } else { + RARRAY(ary)->len = end; p = RARRAY(ary)->ptr + beg; pend = p + len; while (p < pend) { |