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:
parent
938fcd6b70
commit
d47e8e81a0
2 changed files with 30 additions and 13 deletions
11
ChangeLog
11
ChangeLog
|
@ -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
32
array.c
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue