ruby-changes:11724
From: nobu <ko1@a...>
Date: Fri, 8 May 2009 10:07:19 +0900 (JST)
Subject: [ruby-changes:11724] Ruby:r23367 (trunk): * array.c (rb_ary_flatten_bang): clears temporary array.
nobu 2009-05-08 10:07:03 +0900 (Fri, 08 May 2009) New Revision: 23367 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=23367 Log: * array.c (rb_ary_flatten_bang): clears temporary array. Modified files: trunk/ChangeLog trunk/array.c Index: array.c =================================================================== --- array.c (revision 23366) +++ array.c (revision 23367) @@ -382,10 +382,18 @@ rb_ary_free(VALUE ary) { if (ARY_OWNS_HEAP_P(ary)) { - xfree(RARRAY_PTR(ary)); + xfree(ARY_HEAP_PTR(ary)); } } +static inline void +ary_discard(VALUE ary) +{ + rb_ary_free(ary); + RBASIC(ary)->flags |= RARRAY_EMBED_FLAG; + RBASIC(ary)->flags &= ~RARRAY_EMBED_LEN_MASK; +} + static VALUE ary_make_shared(VALUE ary) { @@ -3341,8 +3349,13 @@ if (level == 0) return Qnil; result = flatten(ary, level, &mod); - if (mod == 0) return Qnil; + if (mod == 0) { + ary_discard(result); + return Qnil; + } + if (!(mod = ARY_EMBED_P(result))) rb_obj_freeze(result); rb_ary_replace(ary, result); + if (mod) ARY_SET_EMBED_LEN(result, 0); return ary; } Index: ChangeLog =================================================================== --- ChangeLog (revision 23366) +++ ChangeLog (revision 23367) @@ -1,3 +1,7 @@ +Fri May 8 10:07:02 2009 Nobuyoshi Nakada <nobu@r...> + + * array.c (rb_ary_flatten_bang): clears temporary array. + Fri May 8 02:30:14 2009 Akinori MUSHA <knu@i...> * lib/set.rb (SortedSet#add): Do not require each newly added -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/