ruby-changes:6103
From: akr <ko1@a...>
Date: Fri, 27 Jun 2008 21:57:05 +0900 (JST)
Subject: [ruby-changes:6103] Ruby:r17615 (ruby_1_8, trunk): * gc.c: __size__ removed. use the length of __members__ instead.
akr 2008-06-27 21:56:45 +0900 (Fri, 27 Jun 2008) New Revision: 17615 Modified files: branches/ruby_1_8/ChangeLog branches/ruby_1_8/struct.c trunk/ChangeLog trunk/struct.c Log: * gc.c: __size__ removed. use the length of __members__ instead. (num_members): new function. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=17615&r2=17614&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=17615&r2=17614&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/struct.c?r1=17615&r2=17614&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/struct.c?r1=17615&r2=17614&diff_format=u Index: ChangeLog =================================================================== --- ChangeLog (revision 17614) +++ ChangeLog (revision 17615) @@ -1,3 +1,8 @@ +Fri Jun 27 21:38:57 2008 Tanaka Akira <akr@f...> + + * gc.c: __size__ removed. use the length of __members__ instead. + (num_members): new function. + Fri Jun 27 21:19:08 2008 Nobuyoshi Nakada <nobu@r...> * test/inlinetest.rb (InlineTest.in_progname): workaround for frozen Index: struct.c =================================================================== --- struct.c (revision 17614) +++ struct.c (revision 17615) @@ -193,7 +193,6 @@ } nstr = rb_define_class_under(klass, rb_id2name(id), klass); } - rb_iv_set(nstr, "__size__", LONG2NUM(RARRAY_LEN(members))); rb_iv_set(nstr, "__members__", members); rb_define_alloc_func(nstr, struct_alloc); @@ -249,7 +248,6 @@ rb_class_inherited(super, klass); } - rb_iv_set(klass, "__size__", LONG2NUM(RARRAY_LEN(members))); rb_iv_set(klass, "__members__", members); if (alloc) @@ -340,6 +338,17 @@ return st; } +static size_t +num_members(VALUE klass) +{ + VALUE members; + members = rb_struct_iv_get(klass, "__members__"); + if (TYPE(members) != T_ARRAY) { + rb_raise(rb_eTypeError, "broken members"); + } + return RARRAY_LEN(members); +} + /* */ @@ -347,12 +356,10 @@ rb_struct_initialize(VALUE self, VALUE values) { VALUE klass = rb_obj_class(self); - VALUE size; long n; rb_struct_modify(self); - size = rb_struct_iv_get(klass, "__size__"); - n = FIX2LONG(size); + n = num_members(klass); if (n < RARRAY_LEN(values)) { rb_raise(rb_eArgError, "struct size differs"); } @@ -367,13 +374,11 @@ static VALUE struct_alloc(VALUE klass) { - VALUE size; long n; NEWOBJ(st, struct RStruct); OBJSETUP(st, klass, T_STRUCT); - size = rb_struct_iv_get(klass, "__size__"); - n = FIX2LONG(size); + n = num_members(klass); if (0 < n && n <= RSTRUCT_EMBED_LEN_MAX) { RBASIC(st)->flags &= ~RSTRUCT_EMBED_LEN_MASK; @@ -398,12 +403,11 @@ VALUE rb_struct_new(VALUE klass, ...) { - VALUE sz, *mem; + VALUE *mem; long size, i; va_list args; - sz = rb_struct_iv_get(klass, "__size__"); - size = FIX2LONG(sz); + size = num_members(klass); mem = ALLOCA_N(VALUE, size); va_start(args, klass); for (i=0; i<size; i++) { Index: ruby_1_8/ChangeLog =================================================================== --- ruby_1_8/ChangeLog (revision 17614) +++ ruby_1_8/ChangeLog (revision 17615) @@ -1,3 +1,8 @@ +Fri Jun 27 21:38:57 2008 Tanaka Akira <akr@f...> + + * gc.c: __size__ removed. use the length of __members__ instead. + (num_members): new function. + Fri Jun 27 15:05:06 2008 Nobuyoshi Nakada <nobu@r...> * common.mk (-IF-NO-STRING-LITERAL-CONCATENATION-): make description Index: ruby_1_8/struct.c =================================================================== --- ruby_1_8/struct.c (revision 17614) +++ ruby_1_8/struct.c (revision 17615) @@ -206,7 +206,6 @@ } nstr = rb_define_class_under(klass, rb_id2name(id), klass); } - rb_iv_set(nstr, "__size__", LONG2NUM(RARRAY(members)->len)); rb_iv_set(nstr, "__members__", members); rb_define_alloc_func(nstr, struct_alloc); @@ -326,6 +325,17 @@ return st; } +static size_t +num_members(VALUE klass) +{ + VALUE members; + members = rb_struct_iv_get(klass, "__members__"); + if (TYPE(members) != T_ARRAY) { + rb_raise(rb_eTypeError, "broken members"); + } + return RARRAY_LEN(members); +} + /* */ @@ -334,12 +344,10 @@ VALUE self, values; { VALUE klass = rb_obj_class(self); - VALUE size; long n; rb_struct_modify(self); - size = rb_struct_iv_get(klass, "__size__"); - n = FIX2LONG(size); + n = num_members(klass); if (n < RARRAY(values)->len) { rb_raise(rb_eArgError, "struct size differs"); } @@ -355,13 +363,11 @@ struct_alloc(klass) VALUE klass; { - VALUE size; long n; NEWOBJ(st, struct RStruct); OBJSETUP(st, klass, T_STRUCT); - size = rb_struct_iv_get(klass, "__size__"); - n = FIX2LONG(size); + n = num_members(klass); st->ptr = ALLOC_N(VALUE, n); rb_mem_clear(st->ptr, n); @@ -386,12 +392,11 @@ va_dcl #endif { - VALUE sz, *mem; + VALUE *mem; long size, i; va_list args; - sz = rb_struct_iv_get(klass, "__size__"); - size = FIX2LONG(sz); + size = num_members(klass); mem = ALLOCA_N(VALUE, size); va_init_list(args, klass); for (i=0; i<size; i++) { -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/