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

ruby-changes:10177

From: matz <ko1@a...>
Date: Thu, 22 Jan 2009 00:33:23 +0900 (JST)
Subject: [ruby-changes:10177] Ruby:r21721 (ruby_1_8): * array.c (ary_double_capa): a new function to expand array more

matz	2009-01-22 00:33:06 +0900 (Thu, 22 Jan 2009)

  New Revision: 21721

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=21721

  Log:
    * array.c (ary_double_capa): a new function to expand array more
      aggressively.   [ruby-core:21460]
    * array.c (rb_ary_store): use ary_double_capa().
    
    * array.c (rb_ary_splice): ditto.

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/array.c

Index: ruby_1_8/array.c
===================================================================
--- ruby_1_8/array.c	(revision 21720)
+++ ruby_1_8/array.c	(revision 21721)
@@ -43,6 +43,29 @@
     }
 }
 
+static void
+ary_resize_capa(VALUE ary, long capacity)
+{
+    REALLOC_N(RARRAY(ary)->ptr, VALUE, capacity);
+    RARRAY(ary)->aux.capa = capacity;
+}
+
+static void
+ary_double_capa(VALUE ary, long min)
+{
+    long new_capa = RARRAY(ary)->aux.capa / 2;
+
+    if (new_capa < ARY_DEFAULT_SIZE) {
+	new_capa = ARY_DEFAULT_SIZE;
+    }
+    if (new_capa >= ARY_MAX_SIZE - min) {
+	new_capa = (ARY_MAX_SIZE - min) / 2;
+    }
+    new_capa += min;
+    REALLOC_N(RARRAY(ary)->ptr, VALUE, new_capa);
+    RARRAY(ary)->aux.capa = new_capa;
+}
+
 #define ARY_TMPLOCK  FL_USER1
 
 static inline void
@@ -386,17 +409,7 @@
 
     rb_ary_modify(ary);
     if (idx >= RARRAY(ary)->aux.capa) {
-	long new_capa = RARRAY(ary)->aux.capa / 2;
-
-	if (new_capa < ARY_DEFAULT_SIZE) {
-	    new_capa = ARY_DEFAULT_SIZE;
-	}
-	if (new_capa >= ARY_MAX_SIZE - idx) {
-	    new_capa = (ARY_MAX_SIZE - idx) / 2;
-	}
-	new_capa += idx;
-	REALLOC_N(RARRAY(ary)->ptr, VALUE, new_capa);
-	RARRAY(ary)->aux.capa = new_capa;
+	ary_double_capa(ary, idx);
     }
     if (idx > RARRAY(ary)->len) {
 	rb_mem_clear(RARRAY(ary)->ptr + RARRAY(ary)->len,
@@ -1099,8 +1112,7 @@
 	}
 	len = beg + rlen;
 	if (len >= RARRAY(ary)->aux.capa) {
-	    REALLOC_N(RARRAY(ary)->ptr, VALUE, len);
-	    RARRAY(ary)->aux.capa = len;
+	    ary_double_capa(ary, len);
 	}
 	rb_mem_clear(RARRAY(ary)->ptr + RARRAY(ary)->len, beg - RARRAY(ary)->len);
 	if (rlen > 0) {
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 21720)
+++ ruby_1_8/ChangeLog	(revision 21721)
@@ -1,3 +1,12 @@
+Wed Jan 21 17:25:41 2009  Yukihiro Matsumoto  <matz@r...>
+
+	* array.c (ary_double_capa): a new function to expand array more
+	  aggressively.   [ruby-core:21460]
+
+	* array.c (rb_ary_store): use ary_double_capa().
+
+	* array.c (rb_ary_splice): ditto.
+
 Wed Jan 21 15:43:19 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* enumerator.c (inspect_enumerator, yielder_new_i): added

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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