зеркало из https://github.com/github/ruby.git
* 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:
Родитель
9da4ec12df
Коммит
f23292afb4
|
@ -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
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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче