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

ruby-changes:11844

From: nobu <ko1@a...>
Date: Wed, 20 May 2009 19:42:01 +0900 (JST)
Subject: [ruby-changes:11844] Ruby:r23499 (trunk): * struct.c (rb_struct_new): get rid of too large alloca.

nobu	2009-05-20 19:41:46 +0900 (Wed, 20 May 2009)

  New Revision: 23499

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

  Log:
    * struct.c (rb_struct_new): get rid of too large alloca.
    * struct.c (rb_struct_hash): use long.

  Modified files:
    trunk/ChangeLog
    trunk/struct.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 23498)
+++ ChangeLog	(revision 23499)
@@ -1,3 +1,9 @@
+Wed May 20 19:41:44 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* struct.c (rb_struct_new): get rid of too large alloca.
+
+	* struct.c (rb_struct_hash): use long.
+
 Wed May 20 18:58:27 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* vm_eval.c, vm_insnhelper.c: argument number is restricted to
Index: struct.c
===================================================================
--- struct.c	(revision 23498)
+++ struct.c	(revision 23499)
@@ -129,7 +129,8 @@
 static VALUE rb_struct_ref8(VALUE obj) {return RSTRUCT_PTR(obj)[8];}
 static VALUE rb_struct_ref9(VALUE obj) {return RSTRUCT_PTR(obj)[9];}
 
-#define N_REF_FUNC (sizeof(ref_func) / sizeof(ref_func[0]))
+#define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
+#define N_REF_FUNC numberof(ref_func)
 
 static VALUE (*const ref_func[])(VALUE) = {
     rb_struct_ref0,
@@ -342,7 +343,7 @@
     return st;
 }
 
-static size_t
+static long
 num_members(VALUE klass)
 {
     VALUE members;
@@ -412,12 +413,15 @@
 VALUE
 rb_struct_new(VALUE klass, ...)
 {
-    VALUE *mem;
+    VALUE tmpargs[N_REF_FUNC], *mem = tmpargs;
     long size, i;
     va_list args;
 
     size = num_members(klass);
-    mem = ALLOCA_N(VALUE, size);
+    if (size > numberof(tmpargs)) {
+	tmpargs[0] = rb_ary_tmp_new(size);
+	mem = RARRAY_PTR(tmpargs[0]);
+    }
     va_start(args, klass);
     for (i=0; i<size; i++) {
 	mem[i] = va_arg(args, VALUE);
@@ -809,7 +813,7 @@
 rb_struct_hash(VALUE s)
 {
     long i;
-    unsigned h;
+    unsigned long h;
     VALUE n;
 
     h = rb_hash_start(rb_hash(rb_obj_class(s)));

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

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