1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* array.c (ary_double_capa): a new function to expand array more

aggressively.   [ruby-core:21460]

* array.c (rb_ary_store): use ary_double_capa().

* array.c (rb_ary_unshift_m): ditto.

* array.c (rb_ary_splice): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21719 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2009-01-21 15:27:35 +00:00
parent 938fcd6b70
commit d47e8e81a0
2 changed files with 30 additions and 13 deletions

View file

@ -6,6 +6,17 @@ Wed Jan 21 21:43:50 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ruby.c (load_file_internal): rests EOF flag to make possible to
load from stdin after reading data.
Wed Jan 21 17:17:18 2009 Yukihiro Matsumoto <matz@ruby-lang.org>
* array.c (ary_double_capa): a new function to expand array more
aggressively. [ruby-core:21460]
* array.c (rb_ary_store): use ary_double_capa().
* array.c (rb_ary_unshift_m): ditto.
* array.c (rb_ary_splice): ditto.
Wed Jan 21 15:32:15 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* io.c (rb_io_ungetbyte, rb_io_ungetc): clears EOF flag.

32
array.c
View file

@ -172,6 +172,21 @@ ary_resize_capa(VALUE ary, long capacity)
}
}
static void
ary_double_capa(VALUE ary, long min)
{
long new_capa = ARY_CAPA(ary) / 2;
if (new_capa < ARY_DEFAULT_SIZE) {
new_capa = ARY_DEFAULT_SIZE;
}
if (new_capa >= ARY_MAX_SIZE - min) {
new_capa = (ARY_MAX_SIZE - min) / 2;
}
new_capa += min;
ary_resize_capa(ary, new_capa);
}
static void
rb_ary_decrement_share(VALUE shared)
{
@ -580,16 +595,7 @@ rb_ary_store(VALUE ary, long idx, VALUE val)
rb_ary_modify(ary);
if (idx >= ARY_CAPA(ary)) {
long new_capa = ARY_CAPA(ary) / 2;
if (new_capa < ARY_DEFAULT_SIZE) {
new_capa = ARY_DEFAULT_SIZE;
}
if (new_capa >= ARY_MAX_SIZE - idx) {
new_capa = (ARY_MAX_SIZE - idx) / 2;
}
new_capa += idx;
ary_resize_capa(ary, new_capa);
ary_double_capa(ary, idx);
}
if (idx > RARRAY_LEN(ary)) {
rb_mem_clear(RARRAY_PTR(ary) + RARRAY_LEN(ary),
@ -839,7 +845,7 @@ rb_ary_unshift_m(int argc, VALUE *argv, VALUE ary)
if (argc == 0) return ary;
rb_ary_modify(ary);
if (ARY_CAPA(ary) <= (len = RARRAY_LEN(ary)) + argc) {
ary_resize_capa(ary, len + argc + ARY_DEFAULT_SIZE);
ary_double_capa(ary, len + argc);
}
/* sliding items */
@ -1203,7 +1209,7 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
}
len = beg + rlen;
if (len >= ARY_CAPA(ary)) {
ary_resize_capa(ary, len);
ary_double_capa(ary, len);
}
rb_mem_clear(RARRAY_PTR(ary) + RARRAY_LEN(ary), beg - RARRAY_LEN(ary));
if (rlen > 0) {
@ -1216,7 +1222,7 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
alen = RARRAY_LEN(ary) + rlen - len;
if (alen >= ARY_CAPA(ary)) {
ary_resize_capa(ary, alen);
ary_double_capa(ary, alen);
}
if (len != rlen) {