[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]