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;
|