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

ruby-changes:8629

From: matz <ko1@a...>
Date: Mon, 10 Nov 2008 09:51:27 +0900 (JST)
Subject: [ruby-changes:8629] Ruby:r20164 (trunk): * struct.c (rb_struct_initialize_m): avoid unnecessary array

matz	2008-11-10 09:51:14 +0900 (Mon, 10 Nov 2008)

  New Revision: 20164

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

  Log:
    * struct.c (rb_struct_initialize_m): avoid unnecessary array
      allocation.

  Modified files:
    trunk/ChangeLog
    trunk/struct.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 20163)
+++ ChangeLog	(revision 20164)
@@ -1,3 +1,8 @@
+Sun Nov  9 13:04:52 2008  Yukihiro Matsumoto  <matz@r...>
+
+	* struct.c (rb_struct_initialize_m): avoid unnecessary array
+	  allocation.
+
 Sun Nov  9 04:10:19 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* vm_dump.c (control_frame_dump): suppresses finished method name.
Index: struct.c
===================================================================
--- struct.c	(revision 20163)
+++ struct.c	(revision 20164)
@@ -352,25 +352,30 @@
 /*
  */
 
-VALUE
-rb_struct_initialize(VALUE self, VALUE values)
+static VALUE
+rb_struct_initialize_m(int argc, VALUE *argv, VALUE self)
 {
     VALUE klass = rb_obj_class(self);
     long n;
 
     rb_struct_modify(self);
     n = num_members(klass);
-    if (n < RARRAY_LEN(values)) {
+    if (n < argc) {
 	rb_raise(rb_eArgError, "struct size differs");
     }
-    MEMCPY(RSTRUCT_PTR(self), RARRAY_PTR(values), VALUE, RARRAY_LEN(values));
-    if (n > RARRAY_LEN(values)) {
-	rb_mem_clear(RSTRUCT_PTR(self)+RARRAY_LEN(values),
-		     n-RARRAY_LEN(values));
+    MEMCPY(RSTRUCT_PTR(self), argv, VALUE, argc);
+    if (n > argc) {
+	rb_mem_clear(RSTRUCT_PTR(self)+argc, n-argc);
     }
     return Qnil;
 }
 
+VALUE
+rb_struct_initialize(VALUE self, VALUE values)
+{
+    return rb_struct_initialize_m(RARRAY_LEN(values), RARRAY_PTR(values), self);
+}
+
 static VALUE
 struct_alloc(VALUE klass)
 {
@@ -879,7 +884,7 @@
     rb_undef_alloc_func(rb_cStruct);
     rb_define_singleton_method(rb_cStruct, "new", rb_struct_s_def, -1);
 
-    rb_define_method(rb_cStruct, "initialize", rb_struct_initialize, -2);
+    rb_define_method(rb_cStruct, "initialize", rb_struct_initialize_m, -1);
     rb_define_method(rb_cStruct, "initialize_copy", rb_struct_init_copy, 1);
 
     rb_define_method(rb_cStruct, "==", rb_struct_equal, 1);

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

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