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

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/

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