Bug #7356 » r37410-adapted37582-partially.patch
| array.c | ||
|---|---|---|
|
}
|
||
|
}
|
||
|
static void
|
||
|
ary_ensure_room_for_push(VALUE ary, long add_len)
|
||
|
{
|
||
|
long new_len = RARRAY_LEN(ary) + add_len;
|
||
|
long capa;
|
||
|
if (ARY_SHARED_P(ary)) {
|
||
|
if (new_len > RARRAY_EMBED_LEN_MAX) {
|
||
|
VALUE shared = ARY_SHARED(ary);
|
||
|
if (ARY_SHARED_NUM(shared) == 1) {
|
||
|
if (RARRAY_PTR(ary) - RARRAY_PTR(shared) + new_len <= RARRAY_LEN(shared)) {
|
||
|
rb_ary_modify_check(ary);
|
||
|
}
|
||
|
else {
|
||
|
/* if array is shared, than it is likely it participate in push/shift pattern */
|
||
|
rb_ary_modify(ary);
|
||
|
capa = ARY_CAPA(ary);
|
||
|
if (new_len > capa - (capa >> 6)) {
|
||
|
ary_double_capa(ary, new_len);
|
||
|
}
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
rb_ary_modify(ary);
|
||
|
capa = ARY_CAPA(ary);
|
||
|
if (new_len > capa) {
|
||
|
ary_double_capa(ary, new_len);
|
||
|
}
|
||
|
}
|
||
|
/*
|
||
|
* call-seq:
|
||
|
* ary.freeze -> ary
|
||
| ... | ... | |
|
VALUE
|
||
|
rb_ary_cat(VALUE ary, const VALUE *ptr, long len)
|
||
|
{
|
||
|
long oldlen;
|
||
|
long oldlen = RARRAY_LEN(ary);
|
||
|
rb_ary_modify(ary);
|
||
|
oldlen = RARRAY_LEN(ary);
|
||
|
ary_resize_capa(ary, oldlen + len);
|
||
|
ary_ensure_room_for_push(ary, len);
|
||
|
MEMCPY(RARRAY_PTR(ary) + oldlen, ptr, VALUE, len);
|
||
|
ARY_SET_LEN(ary, oldlen + len);
|
||
|
return ary;
|
||