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/