* array.c (ary_make_shared): returns shared root array itself, and

frozen array can be shared.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22231 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2009-02-11 06:47:12 +00:00
Родитель 9da4ec12df
Коммит f23292afb4
2 изменённых файлов: 20 добавлений и 3 удалений

Просмотреть файл

@ -1,3 +1,8 @@
Wed Feb 11 15:47:10 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* array.c (ary_make_shared): returns shared root array itself, and
frozen array can be shared.
Wed Feb 11 14:46:16 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* insns.def (setspecial, putstring): fixed typos in rdoc.

18
array.c
Просмотреть файл

@ -211,14 +211,16 @@ rb_ary_unshare(VALUE ary)
}
static inline void
rb_ary_unshare_safe(VALUE ary) {
rb_ary_unshare_safe(VALUE ary)
{
if (ARY_SHARED_P(ary) && !ARY_EMBED_P(ary)) {
rb_ary_unshare(ary);
}
}
static VALUE
rb_ary_increment_share(VALUE shared) {
rb_ary_increment_share(VALUE shared)
{
int num = ARY_SHARED_NUM(shared);
if (num >= 0) {
ARY_SET_SHARED_NUM(shared, num + 1);
@ -390,6 +392,15 @@ ary_make_shared(VALUE ary)
if (ARY_SHARED_P(ary)) {
return ARY_SHARED(ary);
}
else if (ARY_SHARED_ROOT_P(ary)) {
return ary;
}
else if (OBJ_FROZEN(ary)) {
ary_resize_capa(ary, ARY_HEAP_LEN(ary));
FL_SET_SHARED_ROOT(ary);
ARY_SET_SHARED_NUM(ary, 0);
return ary;
}
else {
NEWOBJ(shared, struct RArray);
OBJSETUP(shared, 0, T_ARRAY);
@ -2389,7 +2400,8 @@ rb_ary_replace(VALUE copy, VALUE orig)
VALUE shared = ary_make_shared(orig);
if (ARY_OWNS_HEAP_P(copy)) {
xfree(RARRAY_PTR(copy));
} else {
}
else {
rb_ary_unshare_safe(copy);
}
FL_UNSET_EMBED(copy);