ruby-changes:10668
From: nobu <ko1@a...>
Date: Wed, 11 Feb 2009 15:47:23 +0900 (JST)
Subject: [ruby-changes:10668] Ruby:r22231 (trunk): * array.c (ary_make_shared): returns shared root array itself, and
nobu 2009-02-11 15:47:12 +0900 (Wed, 11 Feb 2009) New Revision: 22231 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=22231 Log: * array.c (ary_make_shared): returns shared root array itself, and frozen array can be shared. Modified files: trunk/ChangeLog trunk/array.c Index: array.c =================================================================== --- array.c (revision 22230) +++ array.c (revision 22231) @@ -211,14 +211,16 @@ } 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 @@ 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 @@ 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); Index: ChangeLog =================================================================== --- ChangeLog (revision 22230) +++ ChangeLog (revision 22231) @@ -1,3 +1,8 @@ +Wed Feb 11 15:47:10 2009 Nobuyoshi Nakada <nobu@r...> + + * 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@r...> * insns.def (setspecial, putstring): fixed typos in rdoc. -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/